【发布时间】:2020-09-28 03:44:49
【问题描述】:
我正在使用 Spring Boot 开发一种将多个 .pfd 文件连接成一个并返回其字节数组的方法:
public byte[] concatDocs() {
List<Doc> documents = getAllDocs();
PDFMergerUtility ut = new PDFMergerUtility();
String nameOfTemporaryFile = "temporaryFile.pdf";
File file = new File(nameOfTemporaryFile);
FileOutputStream out = null;
try {
out = new FileOutputStream(file);
for (Doc doc : documents) {
InputStream is = new ByteArrayInputStream(doc.getFile());
ut.addSource(is);
}
ut.setDestinationStream(out);
ut.mergeDocuments(null);
byte[] fileBytes = Files.readAllBytes(file.toPath());
file.delete();
return fileBytes;
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
代码本身运行良好:它获取Doc 列表,创建临时File 以及FileOutputStream(来自java.io),使用PDFMergerUtility 合并文件并生成字节数组,最后从计算机中删除文件。我的问题是:
我在互联网上看到的每个与 I/O 流一起使用的代码最后总是会关闭它们(使用 stream.close()),但我从来没有找到一个很好的解释来解释为什么它们总是这样做......
我应该在readAllBytes 之前关闭out 吗?
我应该在删除文件之前还是之后关闭out?
当我删除文件时,我什至需要关闭out吗?
如果抛出异常怎么办?我应该在 finally 子句上关闭 out 吗?
我应该在某个地方out.flush() 吗?
我应该打电话给System.gc();吗?
提前致谢。
【问题讨论】:
-
这个问题和你的类似。 stackoverflow.com/questions/26541513/…
-
您需要在删除文件之前关闭它。否则删除可能无效。但是如果你要将它全部加载到内存中,为什么不使用
ByteArrayOutputStream来代替呢?
标签: java spring-boot file-io