如何在每次[插入间隔]中写入文件?

时间:2012-01-10 00:01:57

标签: java file-io

我知道如何用Java写入文件。我的问题是基于什么时候我应该释放资源。

如果我有一个每隔2分钟将ArrayList的内容写入文件的线程,我该如何处理文件处理的资源。该文件可以在任何时候被其他程序读取。

每次写入文件时,我都会在循环的每次迭代后关闭FileOutputStreamPrintWriter,或者在线程终止时保持它们打开并关闭它们会更有效。或者这会锁定文件,以便其他程序无法读取?

3 个答案:

答案 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上,您仍然可以打开打开的文件(例如尾随日志文件)。