2012-01-10 104 views
2

我知道如何写入Java文件。我的问题是基于什么时候我应该释放资源。每隔[在此处插入间隔]如何写入文件?

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

每次我写入文件时,在循环的每次迭代后关闭FileOutputStreamPrintWriter,或者在线程终止时保持打开并关闭它们更有效。或者这是否锁定文件,使其不能被另一个程序读取?

回答

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(); 
} 
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更容易理解。请参阅this link

有关摆动定时器的更多信息,请参见this link

WC

+0

该代码是无关的,但你没有回答我的问题。我必须关闭该文件以让其他应用程序访问它并在我想写入时重新打开它。 – Cheetah 2012-01-10 00:21:38

+0

为什么使用swing定时器而不是java.util.Timer?在UI代码之外,我会想首先使用java.util.Timer。 – 2012-01-10 00:43:39

0

在Windows上,它会锁定打开的文件。 在Linux/Unix上,您仍然可以打开打开的文件(例如,尾部记录文件)。