[我正在使用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
组合文件并生成字节数组最后从计算机中删除文件。我的问题是:
我在Internet上看到的所有与I / O Stream一起使用的代码都总是最后将它们关闭(使用stream.close()
),但是我从来没有找到关于为什么他们总是这样做的很好的解释...我应该在out
之前关闭readAllBytes
吗?在删除文件之前还是之后应该关闭out
?在删除文件时,我是否还需要关闭out
?如果抛出异常怎么办?我应该在out
子句上关闭finally
吗?我应该在某个地方out.flush()
吗?我应该打System.gc();
吗?
提前感谢。
关闭资源始终可避免数据泄漏。在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中找到更多相同的内容>
从Java 7开始,他们介绍了try与资源的关系(您可以在oracle文档中看到)。它可以帮助减少手动关闭流。