为什么缓冲区写入者不写入文件?

Mav*_*ick 4 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();
                    }
                }
Run Code Online (Sandbox Code Playgroud)

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

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]);
            }
                        }
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

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

编辑:谢谢你们......我想通了.实际上我在eclipse中创建了一个目录,但我没有刷新它以查看内容.愚蠢......反正.谢谢你们

Dar*_*ron 15

有几件事:

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


Tia*_*ago 13

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

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

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