写入文件的问题

时间:2009-10-29 15:34:28

标签: java

我在写文件时遇到问题:

FileInputStream fin;              
try
{
    fin = new FileInputStream ("c:/text.txt");     
    PrintStream p = new PrintStream(fin);
    p.println ("test");
    fin.close();               
}
catch (IOException ioe)
{
    System.err.println (ioe.getMessage);
}

这段代码有问题吗?

4 个答案:

答案 0 :(得分:6)

您需要使用FileOutputStream

答案 1 :(得分:5)

习惯以下结构。你将在Java中大量使用它。

PrintStream out = null;
try {
  out = new PrintStream(new FileOutputStream("c:/text.txt"));
  out.println ("test");
} catch (IOException e) {
  System.err.println (e.getMessage);
} finally {
  if (out != null) {
    try { out.close(): } catch (Exception e) { }
  }
  out = null; // safe but not strictly necessary unless you reuse fin in the same scope
}

至少等到ARM blocks希望在Java 7中出现。

如上所述,您应该关闭PrintStream而不是FileOutputStream,因此以上是更好的使用形式。

答案 2 :(得分:3)

该代码的问题立刻引起了我的注意:

  • 非标准格式。
  • 笨拙的变量名称。
  • 异常处理不好。
  • 如果出现异常,则无法关闭文件。 (使用acquire(); try { use(); } finally { release(); }
  • 隐藏使用默认字符编码。
  • PrintStream吞下例外情况。 BufferedOutputStream更好。
  • 未能冲洗装饰器。它可能仍然有数据缓冲。虽然实际上在这种情况下您已将PrintStream置于自动刷新模式,这可能是性能问题。
  • 使用/作为Windows路径分隔符。你可能能够逃脱它,但它并不好。

所以:

FileOutputStream fileOut = new FileOutputStream(
    "c:\\text.txt"
);
try {
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
        fileOut,
        "UTF-8" // Or, say, Charset.defaultCharset()
    ));
    out.write("test");
    out.newLine()
    out.flush();
} finally {
    fileOut.close();
}

答案 3 :(得分:0)

类:FileInputStream用于读取文件的输入。如果要写入文件,可以使用:FileOutputStream。如果你想让生活变得轻松,你也可以使用BufferedOutputStream

正如所指出的那样,你应该在finally块中关闭你的流。你想要这样做的原因是你的程序不是很小,而且它是一个更大的应用程序。例如,如果您忘记关闭文件流,应用程序将保留它,如果您尝试在文件系统上执行某些操作(至少在Windows中),您将无法执行此操作。我们都看到'文件无法删除,因为它仍处于使用中'错误。

以下是使用FileOutputStream + BufferedOutputStream的示例:http://www.javadb.com/write-to-file-using-bufferedoutputstream