为什么bufferedwriter没有写入文件?

时间:2010-12-13 15:04:26

标签: java io 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中创建了一个目录,但我没有刷新它以查看内容。它很傻......反正很感激。

3 个答案:

答案 0 :(得分:15)

有几件事:

  1. 每次循环都会创建一个新的FileWriter,每次都会截断文件。
  2. BufferedWriter是缓冲的,你永远不会刷新缓冲区。你需要调用bw.flush(),或者甚至更好,在完成后关闭编写器。

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:0)

理想情况下,您应该使用以下构造函数来创建FileWriter

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

第二个参数true用于追加新数据。 FileWriter不会截断您之前的写作。

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