的Java I/O,writng一个数组到一个文本文件
我用下面的代码来写一个数组到文件中:的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行。 这是什么问题,如果你可以建议一些其他方式来做到这一点。
正如其他人指出的那样,缓冲区中可能存在未刷新的数据。
重写你的代码会是这样一种可接受的方式:
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
) - 服从的合同类
- 不会在空值或吞下例外
地址:
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
}
}
你记得关闭输出流?你的例子没有列出对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);
}
1)你可以重写你的第一个代码块,以消除一个catch块和一个毫无意义的空分配。 2)如果像这样使用'closeQuietly',你的应用程序可能会向文件提交不完整的数据,并且不会处理该错误。这是因为关闭可能会写入数据。 – McDowell 2010-08-07 13:58:37
单独冲洗是不够的。您应该明确关闭流以释放资源。 'close()'将已经隐含地刷新缓冲区。 – BalusC 2010-08-07 13:04:34