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

问题描述 投票:0回答:2

[我正在使用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 spring-boot file-io
2个回答
0
投票

关闭资源始终可避免数据泄漏。在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中找到更多相同的内容>


0
投票

从Java 7开始,他们介绍了try与资源的关系(您可以在oracle文档中看到)。它可以帮助减少手动关闭流。

© www.soinside.com 2019 - 2024. All rights reserved.