每当JTextArea
字段的内容发生变化时,我都会给File
写信。我决定每次根据更改事件打开和关闭文件内容。
比如
public void addToLogFile(String changeContent) {
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(currentLogFile,true)));
pw.print(changeContent);
pw.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
与其每次打开和关闭文件,我想也许我们可以在初始阶段打开它,并在需要时转储内容。最后在最后阶段关闭它。
程序初始阶段:
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(currentLogFile,true)));
然后在代码中需要的地方,
pw.print(changeContent); // Most frequent usage
程序的最后阶段:
pw.close();
哪个更有效率?在什么情况下,我必须选择一个?
更有效的方法肯定是打开文件一次。每次打开文件都很费钱。
在一种情况下,它可能是有用的,当文件的新条目出现很长一段时间,所以操作系统不需要保持打开文件处理程序。
另一种我会考虑每次打开和关闭它的情况是,当写操作不经常发生,并且您希望让其他进程写入文件时。或者当您想确保每个条目在写入后都是可见的,但这时您应该更简单地刷新缓冲区。
如果您有许多这样的文本字段,其中每个文本字段与不同的文件相关联,则不保持文件打开将是一种选择。然后,如果文本字段的数量接近打开文件的限制,那么当每个字段占用一个文件描述符时,您的程序可能无法打开任何其他文件,套接字或其他任何文件。
但是,当然,这是一个纯粹的理论考虑。打开文件的限制通常在2000左右,我很难想象一个有2000个文本输入字段的应用程序。
话虽这么说,早期版本的unix find实用程序小心地关闭和稍后重新打开遍历的目录,以避免文件描述符耗尽的问题。但这是在早期,当时的限制是20左右。