2013-03-04 54 views
0

我有一個從SMTP服務器下載電子郵件的bean。閱讀電子郵件後,它會將附件保存在服務器上。要閱讀附件我使用此代碼:FileOutputStream FileNotFoundException儘管mkdirs()和createNewFile()

File f = new File("\\attachments\\" + attachment.getFileName()); 
f.mkdirs(); 
f.createNewFile(); 
FileOutputStream fos = new FileOutputStream(f); 
fos.write(bytes); 
fos.close(); 

我得到FileOutputStream創建FileNotFoundException,我不明白爲什麼。 如果可以提供幫助,我使用帶有GlassFish的NetBeans,並在本地機器中進行調試。

+0

你在哪裏你'bytes'變量從獲得。你可以請在try/catch之間發佈整個代碼。 – SimonSez 2013-03-04 14:54:05

+2

@SimonSez:該部分不會導致異常,因此與問題/問題無關。 – BalusC 2013-03-04 14:58:19

回答

5

當你

f.mkdirs(); 

你創建你的文件(即,您創建不僅目錄「附件」的名稱的目錄,你還可以創建你的附件名的子目錄文件名)。然後

f.createNewFile(); 

由於文件已經存在(以您剛剛創建的目錄的形式),因此不執行任何操作。它返回false來告訴你文件已經存在。

那麼這個失敗:

FileOutputStream fos = new FileOutputStream(f); 

您試圖打開一個目錄的輸出流。系統不允許您在目錄中寫入,因此失敗。

的底線是:

  • mkdirs()沒有做什麼,你認爲它。
  • 你應該檢查你的電話回覆值createNewFile()

最簡單的方法,使其工作是通過更換您的行:

f.getParentFile().mkdirs(); 
+0

它的工作原理,謝謝! – 2013-03-04 15:05:37

+0

並擺脫'f.createNewFile()',這是多餘的。 'new FileOutputStream()'無論如何都會這樣做,所以'createNewFile()'創建的文件將被丟棄。只是浪費時間。 – EJP 2013-03-05 00:49:19