2011-09-25 84 views
5

我在Eclipse中製作了一個Java程序。我開始使用Windows XP,但最近升級了。爲什麼我的程序不能刪除它在Win7下創建的文件?

作爲其保存機制的一部分,程序將設置寫入文件settings_new.sav。如果這樣,它會刪除settings.sav,並重新命名爲與舊名稱匹配。雖然它在winXP下工作(至少我認爲它確實,但我現在無法檢查),但在win7下,它無法刪除該文件,即使它是創建該文件的程序(儘管該程序是一個不同的實例)。

該文件被Eclipse拾取,並可以從那裏很愉快地刪除。我可以手動刪除它。我是我自己電腦上的管理員。該文件夾就在工作區文件夾內,並不在Program Files文件夾中(儘管如此,我不知道最終用戶是否會安裝它)。該程序可以創建和修改文件就好了。它不會拋出任何異常,我認爲如果它是win7阻止它的話。

任何想法?

回答

9

這是由於java.make中的文件鎖定機制,請務必在完成時關閉緩衝流,例如BufferedReader,BufferedInputStream。

+0

它實際上是Windows中的文件鎖定機制。在Linux下,相同的代碼可能工作得很好。但我同意,您應該明確關閉文件的訪問權限,以使其在任何地方正常工作。 –

+0

@MarkRobinson:有趣的是,我也應該在Linux中測試我的swing應用程序。似乎開發人員應該在操作系統級別而不是JVM上預見問題。 – PraveenMax

+1

Windows和Linux有不同的文件鎖定語義。 Linux將允許你刪除一個你已經打開的文件進行編輯而不會被炸燬。然後,您可以創建一個具有相同名稱的新文件,而不會出現問題。在Windows中,如果文件在另一個進程中打開,它可以防止刪除文件。這種情況發生的具體情況很大程度上取決於它是如何打開的(通過方法/和訪問類型)。如果你有更多的問題,我建議你發佈一個針對Windows傢伙的新SO問題:) –

-3

我曾經有這個問題,當你完成使用你的文件,你必須設置你的文件等於空。因此,如果您執行以下操作:

public void createFile(String path) 
{ 
    File file = new File(path); 
    file.createNewFile(); 
    file = null 
} 

您必須在完成使用後將該文件設置爲空,以便系統停止使用該文件。你必須用FileReader和FileWriter來做同樣的事情。您必須將文件讀取器和文件編寫器設置爲空,才能再次訪問該文件。試試這個,讓我知道它是怎麼回事。

+2

這不起作用。所有要做的就是讓Java垃圾回收器稍後再繼續提取。後來未定義。您應該明確地關閉文件的訪問權限,而不是等待垃圾收集器獲取它。 –

+0

多數民衆贊成什麼設置它爲空做,當你設置爲空的Java自動垃圾收集。 – gsfd

+2

這意味着它可用於收集,而不是即時收集。它可以,但它是非常特定於JVM的行爲。 –

相關問題