【问题标题】:why is bufferedwriter not writing in the file?为什么 bufferedwriter 不写入文件?
【发布时间】:2010-12-13 15:04:26
【问题描述】:

这里是代码sn-p。

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

【问题讨论】:

  • 有错误信息吗?是否创建了文件?你在调用 close() 吗?
  • 为什么每次写入都要实例化一个新的 BufferedWriter?此外,您应该始终关闭所有打开的流(工作完成后,ofc :-))。
  • 最后一次编辑后,您仍在循环内创建 BufferedWritter。这将截断您的文件

标签: java io bufferedwriter


【解决方案1】:

有几点:

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

【讨论】:

  • 更好,在快乐的情况下冲洗装饰器。关闭finally 中的底层资源。 (ObFileWriterComment:FileWriter 选择了当时恰好是“默认”的字符编码。明确选择编码要好得多,这意味着避开FileWriter(使用OutputStreamWriter)。)
  • 关闭提供了隐式刷新,因此在大多数简单的代码中,在 finally 中关闭就足够了。
【解决方案2】:
  • 您正在循环内创建 FileWritter,因此您将始终在每个循环中截断文件。
  • 您忘记关闭/刷新写入器
  • 但是运气好的话(终止程序可能会导致写入程序刷新),该文件将包含您输入文件的最后一个单词,我只能猜测这是一个新行,当您打开文件时您可能错过了检查内容。

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

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

【讨论】:

  • 代码不完整,例如我没有声明看起来像导致异常的Tokenizer。这只是一个指导您的示例:)
  • bw.close() 非常重要。感谢您的建议。
  • bw.close() 在您提供的代码 sn-p 中有一些 IOException 的情况下不会被调用。请考虑在您的答案中使用try-with-resources 构造。
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多