2010-08-07 51 views
3

我用下面的代码来写一个数组到文件中:的Java I/O,writng一个数组到一个文本文件

FileWriter fstream1=new FileWriter("outx.txt"); 
BufferedWriter out1= new BufferedWriter(fstream1); 
FileWriter fstream2=new FileWriter("outy.txt"); 
BufferedWriter out2= new BufferedWriter(fstream2); 
for(int i=0;i<320*240;i++) 
{ 

     out1.write(0+System.getProperty("line.separator"));// 
     // out1.write("\n"); 
     out2.write(0+System.getProperty("line.separator")); 
//out2.write("\n"); 

} 

:这里在上面的代码我把所有零 文件应该包含76800行(0),但我的文件只有69932行。 这是什么问题,如果你可以建议一些其他方式来做到这一点。

回答

1

正如其他人指出的那样,缓冲区中可能存在未刷新的数据。

重写你的代码会是这样一种可接受的方式:

Writer out1 = new FileWriter("outx.txt"); 
try { 
    out1 = new BufferedWriter(out1); 
    Writer out2 = new FileWriter("outy.txt"); 
    try { 
    out2 = new BufferedWriter(out2); 
    for (int i = 0; i < 320 * 240; i++) { 
     out1.write(0 + System.getProperty("line.separator")); 
     out2.write(0 + System.getProperty("line.separator")); 
    } 
    } finally { 
    out2.close(); 
    } 
} finally { 
    out1.close(); 
} 

此代码:

  • 将即使通过close
  • 总会释放文件通过close处理数据刷新,发生错误(使用finally
  • 服从的合同类
  • 不会在空值或吞下例外
4

地址:

out1.flush(); 
out2.flush(); 

后for循环。

很可能您的程序在BufferedReader中的缓冲区被刷新之前退出,这是使用缓冲输出的常见问题。

编辑:更正确的解决办法是:

public static void main(String[] args) throws IOException { 
    final String outputString = "0" + System.getProperty("line.separator"); 
    BufferedWriter out1 = null; 
    BufferedWriter out2 = null; 
    try { 
     out1 = new BufferedWriter(new FileWriter("outx.txt")); 
     out2 = new BufferedWriter(new FileWriter("outy.txt")); 
     for(int i = 0; i < 320 * 240; i++) { 
      out1.write(outputString); 
      out2.write(outputString); 
     } 
     out1.flush(); // Not really needed as close will flush, but it is 
     out2.flush(); // useful for describing the intent of the code 
    } finally { 
     closeQuietly(out1); 
     closeQuietly(out2); 
    } 
} 

private static void closeQuietly(Closeable c) { 
    try { 
     if (c != null) { 
      c.close(); 
     } 
    } catch (Exception e) { 
     // No-op 
    } 
} 
+2

单独冲洗是不够的。您应该明确关闭流以释放资源。 'close()'将已经隐含地刷新缓冲区。 – BalusC 2010-08-07 13:04:34

5

你记得关闭输出流?你的例子没有列出对close()的调用,也应该刷新流。 BufferedWriter的默认行为是在关闭正在缓冲的流之前刷新(写入)其剩余内容。

您应该添加:

out1.close();
out2.close();

这是一个非常常见的情况,当文件的结尾被切断时,您忘记关闭用于创建文件的写入器,特别是当您使用BufferedOutputStream或BufferedWriter可能无法刷新其缓冲区时(写入它到文件中),直到它被明确地刷新(或者更常见的是关闭)。

打开流后立即编写close()调用,然后编写所有代码以处理调用之间的流是非常好的习惯。考虑例外情况考虑,该标准要求使用下列成语:

Writer myOutWriter = null; 
try { 
    myOutWriter = new BufferedWriter(new FileWriter("...")); 
    // Write to myOutWriter here 
} catch (IOException ioe) { 
    // Handle any exceptions here 
} finally { 
    try { 
     if (myOutWriter != null) { 
     myOutWriter.close(); 
     } 
    } catch (IOException ioe) { 
     // Not much you can do here 
    } 
} 

阿帕奇共享IO项目(http://commons.apache.org/io/)有一个很好的工具,叫做IOUtils.closeQuietly()的清理由包括尝试捕捉finally块,空检查,并调用关闭到一个方法调用。使用该库的示例如下所示:

Writer myOutWriter = null; 
try { 
    myOutWriter = new BufferedWriter(new FileWriter("...")); 
    // Write to myOutWriter here 
} catch (IOException ioe) { 
    // Handle any exceptions here 
} finally { 
    IOUtils.closeQuietly(myOutWriter); 
} 
+0

1)你可以重写你的第一个代码块,以消除一个catch块和一个毫无意义的空分配。 2)如果像这样使用'closeQuietly',你的应用程序可能会向文件提交不完整的数据,并且不会处理该错误。这是因为关闭可能会写入数据。 – McDowell 2010-08-07 13:58:37

相关问题