【发布时间】: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