java I / O,将数组写入文本文件

时间:2010-08-07 12:30:11

标签: java file io

我正在使用以下代码将数组写入文件:

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行。 问题是什么,如果你可以建议其他方法来做这件事。

3 个答案:

答案 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
  • 的合同
  • 不会使用null或吞下异常