我知道如何用Java写入文件。我的问题是基于什么时候我应该释放资源。
如果我有一个每隔2分钟将ArrayList
的内容写入文件的线程,我该如何处理文件处理的资源。该文件可以在任何时候被其他程序读取。
每次写入文件时,我都会在循环的每次迭代后关闭FileOutputStream
和PrintWriter
,或者在线程终止时保持它们打开并关闭它们会更有效。或者这会锁定文件,以便其他程序无法读取?
答案 0 :(得分:1)
您可以使用Swing计时器:
import javax.swing.Timer;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public static void main (String[] args) {
Timer timer = new Timer(1000 * 60 * 2, new ActionListener() {
public void ActionPerformed(ActionEvent evt) {
// Put your file-writing code in here.
// Yes, you should close the file.
}
});
timer.start();
}
关闭文件可让其他应用程序访问该文件。如果在运行之间移动/重命名/删除文件,它还会使您的代码抛出FileNotFoundException
,这比IOException
更容易理解。
有关文件IO的更多信息:请参阅this link。
有关Swing Timers的更多信息,请参阅this link。
WC
答案 1 :(得分:1)
你应该在完成后关闭文件流,并在下次写入时重新打开它们(2分钟是一个足够长的差距,开启/关闭的开销是无关紧要的。)
为了确保其他程序或线程在您编写时不访问该文件,您应该通过获取FileChannel并调用lock()方法来锁定它。
E.g。
FileLock lock;
FileChannel channel;
try
{
channel = myOutputStream.getChannel();
lock = channel.lock(); // This is a blocking lock, also consider tryLock()
// ... write your data
} catch (Exception e)
{
} finally
{
lock.release();
channel.close();
}
答案 2 :(得分:0)
在Windows上,它会锁定打开的文件。 在Linux / Unix上,您仍然可以打开打开的文件(例如尾随日志文件)。