我正在使用以下代码将数组写入文件:
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行。 问题是什么,如果你可以建议其他方法来做这件事。
答案 0 :(得分: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
}
}
Apache Commons IO Project(http://commons.apache.org/io/)有一个很好的实用程序,叫做IOUtils.closeQuietly(),通过包含try catch,null检查和调用close到一个方法调用来清理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 :(得分: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 :(得分: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
)Closeable
类