2010-12-13 102 views
2

这里是代码片段。为什么bufferedwriter不在文件中写入?

read = new FileReader("trainfiles/"+filenames[i]); 
       br = new BufferedReader(read); 
       while((lines = br.readLine())!=null){ 
        st = new StringTokenizer(lines); 
        while(st.hasMoreTokens()){ 
         bw = new BufferedWriter(new FileWriter("files/file.txt")); 
         bw.write(st.nextToken()); 
         bw.newLine(); 
        } 
       } 

编辑: 我正在从目录读取文件。所以,我需要在每个循环中打开读者。我做了一些修改,但也没有写入该文件。 下面是代码:

for(i=0;i==0;i++){ 
      if(filenames[i].matches(".*ham.*")){ 
       System.out.println("ham:"+filenames[i]); 
       read = new FileReader("trainfiles/"+filenames[i]); 
       br = new BufferedReader(read); 
       while((lines = br.readLine())!=null){ 
        st = new StringTokenizer(lines); 
        while(st.hasMoreTokens()){ 
         System.out.println(st.nextToken()); 
         bw.write(st.nextToken()); 
        } 
       } 
       bw.close(); 
       br.close(); 

      }else{ 
       System.out.println("spam:"+filenames[i]); 
      } 
         } 

编辑: 我修改了代码,但没有成功,

while((lines = br.readLine())!=null){ 
        st = new StringTokenizer(lines); 
        bw = new BufferedWriter(new FileWriter("files/file.txt")); 
        while(st.hasMoreTokens()){ 
         System.out.println(st.nextToken()); 
         bw.write(st.nextToken()); 
        } 
        bw.close(); 
       } 

       br.close(); 

,我得到这个错误:Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(StringTokenizer.java:332) at Test.main(Test.java:30)

编辑: 感谢球员。 。 我想到了。其实我在eclipse中创建了一个目录,我没有刷新它来查看内容。它的傻...... anyways.thanks很多

+1

是否有错误讯息?是否创建了一个文件?你打电话close()吗? – jzd 2010-12-13 15:07:32

+0

为什么你为每一个写你实例化一个新的BufferedWriter?此外,你应该总是关闭所有开放的流(工作完成后,ofc :-))。 – helpermethod 2010-12-13 15:08:31

+0

在您上次编辑之后,您仍然在循环中创建BufferedWritter。这会截断你的文件 – Tiago 2010-12-13 15:37:43

回答

10
  • 您正在循环中创建FileWritter,因此您将始终在每个循环中截断文件。
  • 你忘了关闭/刷新写入器
  • 但有一些运气(终止程序可能会导致写入器刷新),该文件将包含输入文件的最后一个单词,我只能猜测会是一个新行当你打开文件检查内容时,你可能会错过。

你的内循环应该是这样的:

try (BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"))) { 
    while (st.hasMoreTokens()) { 
     bw.write(st.nextToken()); 
     bw.newLine(); 
    } 
} 
+0

代码不完整,例如我没有声明看起来像是导致异常的Tokenizer。这只是一个示例来指导你:) – Tiago 2010-12-13 15:33:00

+0

bw.close()非常重要。感谢您的建议。 – Keyul 2016-07-09 05:56:04

+1

如果您提供的代码片段中存在某个“IOException”,则不会调用bw.close()。请考虑在答案中使用'try-with-resources'构造。 – 2016-09-30 14:51:15

14

几件事情:

  1. 你通过循环,这将每次截断文件创建一个新的FileWriter各一次。
  2. BufferedWriter被缓冲,你永远不会冲洗缓冲区。您需要调用bw.flush(),或者甚至更好,完成后关闭写入器。
+0

更好的是,在幸福的情况下刷新装饰器。在'finally'关闭底层资源。 (ObFileWriterComment:'FileWriter'选择当时恰好是“默认”的字符编码,明显地选择一种编码,这意味着回避'FileWriter'(使用'OutputStreamWriter')。) – 2010-12-13 15:13:50

+0

closing提供了隐式冲洗,所以在最后的最简单的代码关闭是足够的。 – Darron 2010-12-13 19:11:47

0

理想情况下,你应该使用下面的构造函数来创建FileWriter

bw = new BufferedWriter(new FileWriter("files/file.txt",true)); 

第二个参数,true是追加新的数据。 FileWriter不会截断先前的写入。

和您的读者将能够读取正确的数据。

相关问题