我知道如何寫入Java文件。我的問題是基於什麼時候我應該釋放資源。每隔[在此處插入間隔]如何寫入文件?
如果我有一個線程,每2分鐘將一個ArrayList
的內容寫入文件,我該如何處理文件處理的資源。該文件可以在任何時候被另一個程序讀取。
每次我寫入文件時,在循環的每次迭代後關閉FileOutputStream
和PrintWriter
,或者在線程終止時保持打開並關閉它們更有效。或者這是否鎖定文件,使其不能被另一個程序讀取?
我知道如何寫入Java文件。我的問題是基於什麼時候我應該釋放資源。每隔[在此處插入間隔]如何寫入文件?
如果我有一個線程,每2分鐘將一個ArrayList
的內容寫入文件,我該如何處理文件處理的資源。該文件可以在任何時候被另一個程序讀取。
每次我寫入文件時,在循環的每次迭代後關閉FileOutputStream
和PrintWriter
,或者在線程終止時保持打開並關閉它們更有效。或者這是否鎖定文件,使其不能被另一個程序讀取?
您應該在完成時關閉文件流,並在下一次寫入時重新打開這些文件流(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();
}
你可以使用一個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
在Windows上,它會鎖定打開的文件。 在Linux/Unix上,您仍然可以打開打開的文件(例如,尾部記錄文件)。
該代碼是無關的,但你沒有回答我的問題。我必須關閉該文件以讓其他應用程序訪問它並在我想寫入時重新打開它。 – Cheetah 2012-01-10 00:21:38
爲什麼使用swing定時器而不是java.util.Timer?在UI代碼之外,我會想首先使用java.util.Timer。 – 2012-01-10 00:43:39