这仅适用于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是否允许这样做?感谢。
答案 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