我正在使用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()
),但我从来没有找到一个很好的解释为什么他们总是这样做。。。
我应该关门吗 out
在我之前 readAllBytes
?
我应该关门吗 out
在我删除文件之前还是之后?
当我删除文件时,我需要关闭吗 out
?
如果抛出异常怎么办?我应该关门吗 out
在 finally
条款?
我应该吗 out.flush()
在什么地方?
我应该打电话吗 System.gc();
?
提前谢谢。
2条答案
按热度按时间l5tcr1uw1#
最好关闭资源以避免数据泄漏。在
Java-7
我们有“资源试用”功能,您可以使用它。try-with-resources
–允许我们声明要在try块中使用的资源,并保证在执行该块后资源将被关闭。你可以在这里找到更多相同的东西https://mkyong.com/java/try-with-resources-example-in-jdk-7/ 或者
https://www.baeldung.com/java-try-with-resources
6ovsh4lw2#
在Java7中,他们引入了try with resource(您可以在oracle文档中看到)。它可以帮助手动减少关闭流。