最初我有以下代码:
尝试 1
try (var output = new ByteArrayOutputStream();
var printer = new CSVPrinter(new OutputStreamWriter(output), CSVFormat.DEFAULT)) {
printer.printRecord(EMAIL);
for (MyBean mb : items) {
printer.printRecord(mb.getEmail());
}
externalHttpCall(output.toByteArray());
}
在这里我发现有时字节数组没有完全写入。
我知道这是因为在externalHttpCall
调用期间流没有被刷新。
为了修复它,我写了以下内容:
尝试 2
try (var output = new ByteArrayOutputStream();
var printer = new CSVPrinter(new OutputStreamWriter(output), CSVFormat.DEFAULT)) {
printer.printRecord(EMAIL);
for (MyBean mb : items) {
printer.printRecord(mb.getEmail());
}
printer.flush();
log.info("Printer was flushed");
externalHttpCall(output.toByteArray());
}
它解决了这个问题,但是在这里我迷失了一个想法,即仅在externalHttpCall
. 所以我想出了以下解决方案:
尝试 3
externalHttpCall(convertToByteArray(items);
public byte[] convertToByteArray(List<MyBean> items){
try (var output = new ByteArrayOutputStream();
var printer = new CSVPrinter(new OutputStreamWriter(output), CSVFormat.DEFAULT)) {
printer.printRecord(EMAIL);
for (MyBean mb : items) {
printer.printRecord(mb.getEmail());
}
return output.toByteArray();
}
}
我预计刷新会在流关闭之前发生。但根据我的实验,它不起作用。看起来这是因为刷新发生在流关闭之前但在 toByteArray 调用之后。
我该如何解决?