8

这是代码片段。

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中创建了一个目录,我没有刷新它来查看内容。它很愚蠢......无论如何。非常感谢

4

3 回答 3

17

有几件事:

  1. 您每次通过循环创建一个新的 FileWriter ,每次都会截断文件。
  2. BufferedWriter 是缓冲的,你永远不会刷新缓冲区。您需要调用 bw.flush(),或者更好的是,在完成后关闭编写器。
于 2010-12-13T15:08:01.463 回答
15
  • 您正在循环内创建 FileWritter,因此您将始终在每个循环中截断文件。
  • 您忘记关闭/刷新写入器
  • 但是运气好(终止程序可能会导致写入器刷新)该文件将包含您输入文件的最后一个单词,我只能猜测这是一个新行,当您打开文件检查内容时您可能错过了.

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

try (BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"))) {
    while (st.hasMoreTokens()) {
        bw.write(st.nextToken());
        bw.newLine();
    }
}
于 2010-12-13T15:17:44.753 回答
1

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

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

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

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

于 2014-05-04T06:25:45.117 回答