【问题标题】:Losing data while writing with BufferedWriter使用 BufferedWriter 写入时丢失数据
【发布时间】:2012-04-15 13:53:46
【问题描述】:

我想逐行读取一个大的 ASCII 文本文件 (20GB) 并将这些行的一部分复制到一个单独的文件中。以下示例代码在写入输出文件时会丢失数据。我用一些 printlns 测试了 Reader 并按预期工作。我试图增加 BufferedWriter 的缓冲区,但没有任何改善。 flush() 也不起作用。在这种情况下,输出文件应该是 40MB 左右。

我希望你能帮助我, 问候蒂姆

public void split() throws Exception{
    BufferedReader inStream = new BufferedReader(new FileReader("input.txt"));      
    BufferedWriter outStream = new BufferedWriter(new FileWriter("output.txt"));

    for(int i=0;i<700000;i++){
        String tempString = inStream.readLine().trim();
        if(doOtherStuff(tempString,i)){
            break;
        }
        outStream.write(tempString);
        outStream.newLine();
    }
    inStream.close();
    outStream.close();  
}

【问题讨论】:

  • 你为什么使用for循环而不是while循环?
  • 需要复制多少行的信息在文件的第一行读入。我认为这与问题无关,所以缩短了一点。
  • 您没有告诉我们哪些数据丢失或在哪里丢失的细节,并且您不知道为什么您的代码行为不端,所以 all 是相关的。我的经验是,无论您如何计算文件有多少行,最好使用 while 循环并让 BufferedReader 让您知道何时用完可读取的行。它更防白痴。
  • 好的,我将实现 while 循环,以确保我只读取数据(如果有的话)。但问题在于数据的写入。如果我在写入数据之前添加一个 System.out.println(tempString),我可以看到所有行都被正确读入。每行 (->tempString) 包含 30 到 40 个字符。输出文件停在行的中间,所以我会说问题发生在 outStream.write(tempString) 时。也没有抛出异常
  • 可能只是我在过去一两次有趣之后,但我总是在关闭流之前调用 Flush(),因为你正在丢失文件末尾的

标签: java file-io bufferedreader bufferedwriter


【解决方案1】:

也许你是这个意思?

for (;;) {
    String tempString = inStream.readLine();
    if (tempString == null)
        break;
    tempString = tempString.trim();
    if(doOtherStuff(tempString,i)){
        continue; // Skip writing, continue with next line
    }
    outStream.write(tempString);
    outStream.newLine();
}

没有空测试,EOF 会抛出异常。

【讨论】:

  • 你是对的,EOF检查是必要的。但在我目前的情况下,这不是问题,因为我已经使用 System.out.printlns 检查了读入数据
  • readLine() 不会在 EOF 处引发异常。它只是永远返回 null。
  • @EJP 在问题代码中完成了readLine().trim(),这会引发 NullPointerException - 当 EOF 在循环计数器之前。
  • @JoopEggen 没错。 readLine() 不会抛出异常。它返回null((String)null).trim() 抛出异常。与readLine() 无关。
猜你喜欢
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
相关资源
最近更新 更多