2014-12-03 90 views
0

我寫了一個小程序,它壓縮一個tiff文件,並將壓縮的一個文件放在一個單獨的文件夾「壓縮」中,生成的新文件被鎖定通過java.exe,當我嘗試對其執行操作。Java.exe在創建文件後鎖定文件一段時間

當我手動運行該方法,然後java.exe沒有鎖定它,但是當我通過Web服務調用調用該方法,然後它被鎖定,任何想法爲什麼會發生這種情況,但鎖定只是一段時間,之後我可以刪除它

+0

你如何「手動運行該方法」?通過您的IDE或控制檯使用「公共靜態無效主」?如果是,則資源在程序退出時自動釋放。這就是文件未被鎖定的原因。 – cherouvim 2014-12-07 13:54:55

+0

@cherouvim通過IDE,文件沒有被鎖定,但是我把它作爲一個web服務,所以當web服務調用完成後,文件被鎖定一段時間 – 2014-12-08 08:45:15

回答

0

的問題是,因爲垃圾收集器,從netbeans運行時,我猜NetBeans在每次程序執行後調用垃圾回收器,但不是Webservice調用的情況,問題在我的代碼中明確調用GC之後解決。

+0

不確定這是GC問題。 – cherouvim 2014-12-07 09:19:39

+0

@cherouvim它是一個GC問題。 – 2014-12-07 09:54:12

+0

因爲在這裏創建一個壓縮的圖像,我沒有創建一個BufferedWriter什麼的,我使用javax.media.jai.JAI.create()方法來創建圖像。 – 2014-12-07 09:57:37

1

您需要關閉用於寫入文件的資源。

例如用FileWriterBufferedWriter

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); 
} 
+0

由於BufferedWriter在關閉時關閉了它的封閉流,並且因爲FileWriter有一個construtor接受一個字符串,所以也可以簡單地執行'try(BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile))){bw.write(content); }'。 – 2014-12-03 13:49:23

+0

我正在關閉流,它是玻璃魚服務器鎖定文件一段時間 – 2014-12-03 14:11:34

+1

@ChristianHujer,但如果'BufferedWriter'構造函數拋出異常'FileWriter'不會被關閉。 (這對BufferedWriter來說可能不是什麼大問題,但它可能是其他類的重要考慮因素,所以必須仔細考慮是否可以這樣做。) – Wyzard 2014-12-03 14:12:01