删除文件后我应该如何处理fileoutputstream

9avjhtql  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(258)

我正在使用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 ?
如果抛出异常怎么办?我应该关门吗 outfinally 条款?
我应该吗 out.flush() 在什么地方?
我应该打电话吗 System.gc(); ?
提前谢谢。

l5tcr1uw

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

6ovsh4lw

6ovsh4lw2#

在Java7中,他们引入了try with resource(您可以在oracle文档中看到)。它可以帮助手动减少关闭流。

相关问题