我寫了一個小程序,它壓縮一個tiff文件,並將壓縮的一個文件放在一個單獨的文件夾「壓縮」中,生成的新文件被鎖定通過java.exe,當我嘗試對其執行操作。Java.exe在創建文件後鎖定文件一段時間
當我手動運行該方法,然後java.exe沒有鎖定它,但是當我通過Web服務調用調用該方法,然後它被鎖定,任何想法爲什麼會發生這種情況,但鎖定只是一段時間,之後我可以刪除它
我寫了一個小程序,它壓縮一個tiff文件,並將壓縮的一個文件放在一個單獨的文件夾「壓縮」中,生成的新文件被鎖定通過java.exe,當我嘗試對其執行操作。Java.exe在創建文件後鎖定文件一段時間
當我手動運行該方法,然後java.exe沒有鎖定它,但是當我通過Web服務調用調用該方法,然後它被鎖定,任何想法爲什麼會發生這種情況,但鎖定只是一段時間,之後我可以刪除它
的問題是,因爲垃圾收集器,從netbeans運行時,我猜NetBeans在每次程序執行後調用垃圾回收器,但不是Webservice調用的情況,問題在我的代碼中明確調用GC之後解決。
不確定這是GC問題。 – cherouvim 2014-12-07 09:19:39
@cherouvim它是一個GC問題。 – 2014-12-07 09:54:12
因爲在這裏創建一個壓縮的圖像,我沒有創建一個BufferedWriter什麼的,我使用javax.media.jai.JAI.create()方法來創建圖像。 – 2014-12-07 09:57:37
您需要關閉用於寫入文件的資源。
例如用FileWriter
和BufferedWriter
:
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter(new File(outputFile));
bw = new BufferedWriter(fw);
bw.write(content);
} catch (Exception e) {
// do something with e
} finally {
if(bw != null) {
bw.close(); // release the resource
}
}
使用try-與資源,它可以自動關閉atfer的try
塊:
try(FileWriter fw = new FileWriter(new File(outputFile));
BufferedWriter bw = new BufferedWriter(fw)) {
bw.write(content);
}
由於BufferedWriter在關閉時關閉了它的封閉流,並且因爲FileWriter有一個construtor接受一個字符串,所以也可以簡單地執行'try(BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile))){bw.write(content); }'。 – 2014-12-03 13:49:23
我正在關閉流,它是玻璃魚服務器鎖定文件一段時間 – 2014-12-03 14:11:34
@ChristianHujer,但如果'BufferedWriter'構造函數拋出異常'FileWriter'不會被關閉。 (這對BufferedWriter來說可能不是什麼大問題,但它可能是其他類的重要考慮因素,所以必須仔細考慮是否可以這樣做。) – Wyzard 2014-12-03 14:12:01
你如何「手動運行該方法」?通過您的IDE或控制檯使用「公共靜態無效主」?如果是,則資源在程序退出時自動釋放。這就是文件未被鎖定的原因。 – cherouvim 2014-12-07 13:54:55
@cherouvim通過IDE,文件沒有被鎖定,但是我把它作爲一個web服務,所以當web服務調用完成後,文件被鎖定一段時間 – 2014-12-08 08:45:15