【问题标题】:Why aren't all the entries going in the file? [duplicate]为什么不是所有条目都进入文件? [复制]
【发布时间】:2009-11-02 18:09:34
【问题描述】:

在下面的程序中,循环迭代了 1000 次,我正在使用 FileWriter 将所有条目写入文件中,但不幸的是,程序最终只写入了 510(有时是 415,有时是 692,总是少于 1000)个条目该文件,但循环正在迭代 1000 次。

import java.io.* ;
import java.util.*;

public class DemoWriter {

    public static void main(String[] args) throws Exception {

        List<String> receiverList = new ArrayList<String>() ;
        receiverList.add("abc@gmail.com") ;
        receiverList.add("pqr@ibibo.com") ;
        receiverList.add("xyz@gmail.com") ;

        FileWriter fw = new FileWriter("a.txt") ;
        BufferedWriter bw = new BufferedWriter(fw) ;

        int size = receiverList.size() ;

        String str ;
        int count = 0 ;
        for(int i = 1 ; i <= 1000 ; ++i){
            str = receiverList.get( (int) (Math.random() * size) ) + "\n" ;
            bw.write(++count + ".> " + str) ;
            System.out.print(count + ".> " + str) ;
        }
    }
}

这是因为文件大小还是其他原因???


感谢您对这里所有好人的快速响应。我已经更正了我的代码(我只是忘记关闭流,现在代码工作正常)。正如所有人都指出我需要关闭流,但我接受 BalusC,因为他是第一个回复的人。

很高兴在这里找到您的 BalusC。 干杯:)

【问题讨论】:

    标签: java file-io


    【解决方案1】:

    你没有关闭和冲洗你的作家。如果您在代码末尾调用写入器的close() 方法,缓冲区将被刷新并关闭写入器。

    正如 Hank Gay 在 cmets 中指出的那样,close() 方法可能会引发异常(我相信是 IOException)。这意味着您必须将要关闭的调用包装在 try/catch 块中。但是,我看到您的 main 方法会抛出 Exception - 这不是最佳做法,但它会阻止您在此特定实例中需要 try/catch 块。

    【讨论】:

    • 另外,对close() 的调用应该在finally 块中。
    【解决方案2】:

    确实,您应该始终关闭资源以刷新所有内容并释放资源。不需要显式刷新,因为它通常在关闭期间隐式完成。只需在 try-catch-finally 块的 finally 块内调用 Closeable#close() 即可。

    通过Java IO tutorial了解更多信息。

    【讨论】:

    • 您不想在 try-catch 块的 finally 部分调用 close() - 它会引发异常。
    • 所以?只需抓住它并进一步忽略它,或者对它执行 e.printStackTrace() 以用于记录目的。它当然需要在 finally 块中完成,否则会泄漏资源。
    【解决方案3】:

    是否需要关闭 BufferedWriter 和 FileWriter 对象?这可能会留下不完整的文件。

    【讨论】:

    • bw.close() 应该通过 close()。
    【解决方案4】:

    只需添加

        bw.flush();
        bw.close();
    

    到方法结束

    【讨论】:

    • 方法名称是小写的,我相信(需要仔细检查文档),但调用 close 也会刷新缓冲区...
    • 我不确定。在 C# 中肯定是这样。文档说“public void close()throws IOException \\Close the stream。”
    • 这是 Java,不是 C#。然而,它可能取决于作家的类型。
    • 我明白“这是 java”,谢谢。这是关于这个特定作者的 JAVA 文档,好吗?
    猜你喜欢
    • 2020-01-31
    • 2023-03-30
    • 2016-08-22
    • 2011-04-30
    • 1970-01-01
    • 2012-01-18
    • 2021-12-20
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多