2009-11-02 95 views
0

在下面的程序中,循环迭代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("[email protected]") ; 
     receiverList.add("[email protected]") ; 
     receiverList.add("[email protected]") ; 

     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) ; 
     } 
    } 
} 

这是因为文件大小或其他?


Thnx快速响应这里所有的好人。我纠正了我的代码(我忘记关闭流,现在代码工作完美)。正如所有人指出我需要关闭流,但我接受BalusC,因为他是第一个回答。

很高兴在这里你可以看到BalusC。 干杯:)

回答

5

事实上,你应该总是关闭的资源来冲洗一切并释放资源。显式冲洗并不是必需的,因为它通常在关闭期间隐式完成。只需调用Closeable#close()终于块内一个try-catch-finally块和你的罚款。

了解更多的Java IO tutorial

+0

您不想在try-catch块的finally部分调用close() - 它会引发异常。 – 2009-11-02 18:32:28

+2

那么?只需抓住它并进一步忽略它,或者为了记录目的而执行它的e.printStackTrace()。它肯定需要在finally块中完成,因为否则会泄露资源。 – BalusC 2009-11-02 18:35:20

9

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

正如汉克盖伊在评论中指出的那样,close()方法可能会抛出一个异常(我相信一个IOException)。这意味着您必须将呼叫封装在try/catch区块中。但是,我看到你的main方法抛出Exception - 这是不是最好的做法,但它会防止你需要一个try/catch块在这个特殊的实例。

+2

另外,对close()的调用应该放在'finally'块中。 – 2009-11-02 18:13:35

0

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

+0

bw.close()应该通过close()。 – Xailor 2009-11-02 18:41:48

0

只需添加

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

的方法结束

+2

方法名称是小写的,我相信(需要仔细检查文档),但调用close也会刷新缓冲区... – 2009-11-02 18:13:38

+0

我不确定。在C#中肯定如此。 Docs say “public void close()throws IOException \\关闭流。” – ALOR 2009-11-02 18:18:01

+0

这是Java,而不是C#。然而,它可能取决于作家的类型。 – 2009-11-02 18:21:00

相关问题