初学者Q:如何用Java打开文件并保持打开状态

时间:2017-05-31 14:04:50

标签: java file csv

这仅适用于Java中的简单命令行独立程序。

我想打开要写入的文件,并保持打开状态。我需要以人类可读的ASCII格式编写格式化的浮点数/双打,就像CSV文件一样。

我尝试了各种方法(1) (2) (3)我通过自己喜欢的搜索引擎找到了它们,并且它们的格式为:

try {
   // some file handle opening sequence
}
catch ( <some exception> ) {
  // do something
}
finally {
  // do something else
}

(...或者在第三个例子的情况下,文件打开/写入/关闭是在抛出异常的函数内部。)我意识到它的良好编程风格,以确保你&#39 ;我打开了一个文件,但是出于我的目的,这并不是必需的。

无论如何,上述方法的问题是在try {}块之外,文件句柄被关闭。我想保持开放,因为我的代码内核包含一个巨大的循环,我经历了几十万次(比如说),每次通过我想输出一个浮点数(在ASCII)到文件。

使用上面的表单,唯一的方法是将我的巨大for循环包含在try {}块中。这看起来很傻。或者,我可以每次循环重新打开文件,但这意味着额外的逻辑,打开文件作为一个新的&#39;第一次提交,随后附加。

有没有办法打开文件,保持打开以偶尔写入文件,然后在我完成后关闭它?

类似的东西:

{
// open file "data.out"
}
for (i=0;i<100000;i++) {
   // do a lot of stuff
   //
   // calculate some quantity "x"
   //
   // output float "x" in ASCII form, appending it to data.out
}
{
// close data.out
}

Java是否允许这样做?感谢。

2 个答案:

答案 0 :(得分:3)

当然,您可以将FileWriter存储在某处,就像任何其他变量一样。例如,您可以将整个写入逻辑封装在自己的类中,该类为您指定的格式提供一种write方法。

但为什么它看起来很傻?也许这种方法可能会有所帮助......

public void methodA(File myFile) throws IOException{
  try ( FileWriter writer = new FileWriter( myFile ) ) {
     writeTo(writer);
  }
}

private void writeTo(FileWriter writer) throws IOException {
   for (i=0;i<100000;i++) {
   // do a lot of stuff
   //
   // calculate some quantity "x"
   //
   // output float "x" in ASCII form, appending it to data.out
}

}

这样,一种方法可以处理打开/关闭/异常,而另一种方法可以使用给它的FileWriter专注于重要的写入内容。

答案 1 :(得分:0)

如你所说,文件在try块结束时关闭。或者 FileWriter对象是在try块中创建的: (你没有发布真正的java代码,只发布伪代码。)

示例,希望这有帮助

public static void main(String[] args) 
{
...
BufferedWriter ofs=null; // should by outside the try block

try
{ 
 Path logfile = Paths.set("C:\\temp\\log.log");

 ofs = Files.newBufferedWriter(logfile); // new in java 8

 YourWorker.doYourJob(ofs);

} catch (Exception e)
{   e.printStackTrace();
} finally
{
  if (ofs!=null) { try { ofs.close(); } catch (Exception e) {}   }
}
System.exit(1);     
} //---------- end of main()
} //---- end of class