FileWriter - 没有 try-with-resource 数据未完全写入文件 [重复]

Posted

技术标签:

【中文标题】FileWriter - 没有 try-with-resource 数据未完全写入文件 [重复]【英文标题】:FileWriter - without try-with-resource data is not fully written to file [duplicate] 【发布时间】:2020-09-10 10:38:21 【问题描述】:

我想在一个文本文件中写入 100 万行。

当我使用没有try-with-resource 样式的 FileWriter(不释放资源)时,我发现它在 998976 左右停止。

...
998968
998969
998970
998971
998972
998973
998974
998975
998976
9
    @Test
    void writeTooLargeFileThisIsBad() throws IOException 
        File newFile = new File("src/test/resources/targets/large.csv");
        if (!newFile.exists()) newFile.createNewFile();
        FileWriter writer = new FileWriter("src/test/resources/targets/large.csv", StandardCharsets.UTF_8);
        for (int i = 1; i < 1000000; i++) 
            writer.write(String.valueOf(i));
            writer.write(System.lineSeparator());
        
    

但是当我尝试使用资源时,它会正常完成。 (达到999999)

两者都很快。

为什么?

    @Test
    void writeTooLargeFileThisIsGood() throws IOException 
        File newFile = new File("src/test/resources/targets/large.csv");
        if (!newFile.exists()) newFile.createNewFile();
        try (FileWriter writer = new FileWriter("src/test/resources/targets/large.csv", StandardCharsets.UTF_8)) 

            for (int i = 1; i < 1000000; i++) 
                writer.write(String.valueOf(i));
                writer.write(System.lineSeparator());
            
         catch (Exception e) 
            e.printStackTrace();
        
    

【问题讨论】:

可能是因为writer最后没有关闭,所以最后的输出行可能没有被flush并输出到文件中。不过只是猜测。 【参考方案1】:

那是因为您没有在 writer 实例上调用 close() 方法 - 编写器定义了一些缓冲区,能够存储大量未写入的数据

当您使用try-with-resource 方法时,会自动调用close(),以便正确刷新每个数据


在这里阅读更多:

BufferedWriter not writing everything to its output file Is flush() call necessary when using try-with-resources

【讨论】:

以上是关于FileWriter - 没有 try-with-resource 数据未完全写入文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

FileWriter - 没有 try-with-resource 数据未完全写入文件 [重复]

使用具有完整路径的 FileWriter

尝试转让所有权

Java fileWriter 没有将我的所有输出写入文件

Java FileWriter 类 - java.io.FileNotFoundException: * 没有这样的文件或目录 -Ubuntu

FileWriter和BufferedWriter之间的Java区别