我遇到了這種情況,不明白爲什麼會發生這種情況。有人可以幫我理解nio文件鎖定的行爲。在已鎖定的文件上打開文件輸出流會覆蓋該文件
我使用FileOutputStream打開了一個文件,並在使用nio FileLock獲得獨佔鎖之後,我在文件中寫入了一些數據。沒有釋放鎖。在同一個文件上打開另一個FileOutputStream,目的是獲取鎖並執行寫操作,並期望這會失敗。但是打開第二個文件輸出流會覆蓋已鎖定的文件,該文件在寫入數據之前甚至在我嘗試獲得第二個鎖之前。這是預期的嗎?我的理解是獲得排他鎖可以防止對鎖定文件進行任何更改。如何防止在嘗試獲取另一個鎖時覆蓋我的文件? (?彷彿另一個進程試圖獲得對同一文件鎖在不同的虛擬機)
示例程序我想:
File fileToWrite = new File("C:\\temp\\myfile.txt");
FileOutputStream fos1 = new FileOutputStream(fileToWrite);
FileOutputStream fos2 =null;
FileLock lock1,lock2 =null;
lock1=fos1.getChannel().tryLock();
if(lock1!=null){
//wrote date to myfile.txt after acquiring lock
fos1.write(data.getBytes());
//opened myfile.txt again and this replaced the file
fos2 = new FileOutputStream(fileToWrite);
//got an overlappingfilelock exception here
lock2=fos2.getChannel().tryLock();
fos2.write(newdata.getBytes());
}
lock1.release();
fos1.close();
if(lock2!=null)
lock2.release();
fos2.close();
也試過上述分成兩個節目。執行1st並從1st開始等待。被程序1鎖定的文件被程序2覆蓋。下面的示例:
PROGRAM1:
File fileToWrite = new File("C:\\temp\\myfile.txt");
FileOutputStream fos1 = new FileOutputStream(fileToWrite);
FileLock lock1 =null;
lock1=fos1.getChannel().tryLock();
if(lock1!=null){
//wrote date to myfile.txt after acquiring lock
fos1.write(data.getBytes());
System.out.println("wrote data and waiting");
//start other program while sleep
Thread.sleep(10000);
System.out.println("finished wait");
}
lock1.release();
fos1.close();
Program2中:
File fileToWrite = new File("C:\\temp\\myfile.txt");
System.out.println("opening 2nd out stream");
//this overwrote the file
FileOutputStream fos2 = new FileOutputStream(fileToWrite);
FileLock lock2 =null;
lock2=fos2.getChannel().tryLock();
//lock is null here
System.out.println("lock2="+lock2);
if(lock2!=null){
//wrote date to myfile.txt after acquiring lock
System.out.println("writing NEW data");
fos2.write(newdata.getBytes());
}
if(lock2!=null)
lock2.release();
fos2.close();
感謝
MKe你的想法。要麼鎖定所有其他用法,如覆蓋(第1段)*或*鎖定其他鎖定(第2段)。不是在同一時間。 – EJP
@EJP:它*可能*被*其他*進程鎖定而不被覆蓋,但是,正如您所引用的「* system-dependent因此未指定*」。我所說的是它絕對*不*防止*相同* JVM覆蓋,即使在鎖定防止覆蓋的系統上。它*不會鎖定*不同*進程的其他鎖。 – Holger