2013-03-26 51 views
0

打開與FileWriter的文件時,我試圖寫的東西到一個文件中,就像這樣:java.io.FileNotFoundException在Java中

FileWriter fw = new FileWriter("somefile.txt", true); 

它當一個進程開始正常工作。像這樣:

java -jar XXXXXXX.jar 

但是,當由另一個進程調用它時,將引發IOException。例如:

java.io.FileNotFoundException: 'somefile.txt' (No such file or directory) 
    at java.io.FileOutputStream.openAppend(Native Method)      
    at java.io.FileOutputStream.<init>(FileOutputStream.java:192)    
    at java.io.FileOutputStream.<init>(FileOutputStream.java:116)    
    at java.io.FileWriter.<init>(FileWriter.java:61)      
+2

定義「其他處理」。你如何開始你的程序? – 2013-03-26 09:40:20

+2

也許是因爲該文件不存在於其他進程所在的文件夾中? – 2013-03-26 09:40:30

+0

最有可能的是,您的第一個進程開始使用該文件,並未關閉對該文件的引用。因此,當你的第二個進程試圖訪問它(追加模式)時,它會拋出'FNFE'。 – SudoRahul 2013-03-26 09:44:29

回答

1

有幾種可能的解釋:

  1. 過程沒有權限在當前目錄下創建somefile.txt
  2. 在某些操作系統上,如果文件已經存在並正在被另一個進程使用,則可能無法創建/覆蓋該文件。
2

由於異常狀態,文件somefile.txt不存在。除非FileWriter構造函數的第二個參數指示要追加到現有文件,這意味着該文件必須存在,否則這將很好。我建議你使用File.exists()檢查文件是否存在,如果存在則使用new FileWriter("somefile.txt", true);,否則使用new FileWriter("somefile.txt", false);第一次創建該文件。

0

考慮到FileNotFoundException,它很清楚地表明該文件不存在。

我想你的第二個進程從文件不存在的某個根文件夾開始,使用文件的絕對路徑來確保這是問題所在。或者只是使用一個簡單的檢查

if (yourFile.exists()) 

在您訪問它,並且如果不顯示該程序使用的路徑beeing。

0

的JavaDoc

此異常將由FileInputStream中,FileOutputStream中,和RandomAccessFile的 構造被拋出時,使用指定的路徑名​​的文件不存在。如果文件確實存在但由於某種原因無法訪問,則這些構造函數也會拋出 ,例如 當嘗試打開用於寫入的只讀文件時。

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/FileNotFoundException.html

也許你已經打開的文件與進程,而不是關閉該文件,因此,如果您嘗試打開該文件再次,這些異常將被拋出,因爲該文件不能打開兩次

1

當啓動進程2:

  1. 它會嘗試找到somefile.txt在當前目錄。

  2. 如果在當前目錄中找不到具有給定名稱的文件,那麼它將嘗試創建一個新文件,但由於用戶權限無法創建具有給定名稱的新文件。

手動檢查,文件是否存在或不存在於當前目錄中。

3

很多答案錯誤地建議您發生異常,因爲該文件不存在。這不是原因;在documentation for the constructor明確規定:

拋出:
IOException - 如果指定文件存在,但它是一個目錄,而不是一個常規文件, 不存在,但無法創建,或不能打開任何其他原因

如果你傳遞一個相對的文件名(在它沒有「/」或字符串「\」),它是指在一個文件當前目錄。我猜測,當你使用java -jar運行它時,你的當前目錄是你有寫權限的目錄,但是當其他進程運行它時,當前目錄是不可寫的。

過去,較舊的Java版本在嘗試寫入不可寫目錄時,習慣於拋出FileNotFoundException。但最新的Java似乎並沒有這樣做,所以我不確定這是否是問題所在。您可以通過使用java.nio.file軟件包,而不是得到更清晰的例外:

Path path = Paths.get("somefile.txt"); 
Writer writer = Files.newBufferedWriter(path, Charset.defaultCharset(), 
    StandardOpenOption.APPEND, StandardOpenOption.CREATE); 
+1

在這種情況下,他不應該得到拒絕訪問的消息嗎? – CloudyMarble 2013-03-26 10:15:57

+0

你是對的,異常消息將以'(Permission denied)'或'(Access is denied)'或類似的東西結束。我敢肯定,我已經看到了一些情況,至少在舊版Java中,無法寫入文件導致「沒有這樣的文件或目錄」消息,但我不知道要重新創建它。 – VGR 2013-03-26 10:39:17

相關問題