2012-04-15 261 views
0

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

我希望你能帮助我, 问候添

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(); 
} 
+0

为什么你使用for循环而不是while循环? – 2012-04-15 13:55:28

+0

我需要复制多少行的信息与文件的第一行一起读入。我认为这与问题没有关系,所以简单点说吧。 – timmiotooltim 2012-04-15 13:58:35

+0

你不告诉我们什么数据丢失或在哪里的具体情况,你不知道你的代码为什么行为不端,所以***全部***是相关的。我的经验是,无论你如何计算文件的行数,使用while循环的时候要好得多,并让BufferedReader让你知道什么时候它的行数不足以读取。这是更多的白痴证明。 – 2012-04-15 14:00:04

回答

0

也许你的意思呢?

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将引发异常。

+0

你说得对,EOF检查是必要的。但在我目前的情况下,它不是问题,因为我用System.out.printlns – timmiotooltim 2012-04-15 14:15:43

+0

检查了读入数据。readLine()不会在EOF处引发异常。它只是永远返回null。 – EJP 2012-04-15 22:50:52

+0

@EJP在问题代码中执行了'readLine()。trim()'操作,当EOF在循环计数器之前时抛出一个NullPointerException异常。 – 2012-04-16 08:44:33