2012-05-15 48 views
0

問題回答。謝謝大家的意願,幫助並提供援助。import java.util.zip.ZipOutputStream;導致問題與打印到文件

Writer output = null; 
    File pdfFile = new File("MANIFEST.txt");//create text file 
    try { 
     output = new BufferedWriter(new FileWriter(pdfFile)); 
    } catch (IOException e) { 
     //TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    for(int i=0; i<files.length; i++){//create manifesto of pdfs in directory 
     try { 

      System.out.println(copy[i]); 
      output.write(copy[i]); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }   

copy是一個字符串數組。內容正確地打印到控制檯,但不是文件(該文件是通過創建的)。當我包含import java.util.zip.ZipOutputStream時,除非我把它們放在try catch中,否則很多東西都會拋出異常(例如output.write給出「未處理的異常類型IOEception」)。

+1

您不會使用try/catch解決_syntax_錯誤。你的意思是你有什麼異常?如果是的話,在這裏發佈。 – michael667

+0

不知道你的問題是什麼。但是,我認爲您打印的內容在文件中沒有看到。我相信你應該沖洗緩衝寫入器強制寫入for循環之外的文件。 – Drona

+0

對不起,我知道但使用了錯誤的詞。 w/o try catch output.write給出異常「未處理的異常類型IOException」 – babno

回答

0

您在for循環中使用i < files.length作爲條件,但訪問copy[i]。你可能想使用這樣的:

for(int i = 0; i < copy.length; i++) { 
    System.out.println(copy[i]); 
    output.write(copy[i]); 
} 

甚至更​​好,使用foreach循環:

for(final String element : copy) { 
    System.out.println(element); 
    output.write(element); 
} 
+0

我現在得到線程「main」中的運行時異常異常java.lang.NullPointerException \t at java.io.Writer.write(Unknown Source) \t at navigate.main(navigate.java:55)(55 is output。寫) – babno

+0

在此之前(從第一個try/catch塊)得到另一個異常嗎?只要刪除所有的try/catch塊並在方法簽名中添加'throws Exception'。 – michael667

+0

我記得我有一個原因,它是files.length(是該副本大於其中的值的數量)。我解決了這個問題,即使它仍然是copy.length,它已經回到了以前的狀態。如果我註釋掉output.write,那麼我可以看到沒有區別。 – babno

2

你曾經關閉的作家嗎?

在一般情況下,當你創建一個I/O資源(如讀/寫/數據庫連接的/ etc),你應該使用一個finally block,以確保它是封閉的,是這樣的:

Writer writer = new BufferedWriter(...); 
try { 
    // do something with the writer; may be many lines of code 
} 
finally { 
    writer.close(); 
} 

(注意:Java 7對此模式的語法更加簡潔,the try-with-resources block。)

這對於資源管理非常重要(例如,如果不關閉連接/文件,那麼最終您的進程將耗盡文件句柄,將無法再打開)。

但是,還有一個更相關的問題。許多編寫者被緩衝,以避免一次寫入一個字符到底層操作系統的性能問題。當他們呼叫write時,他們將這些數據存儲在一個緩衝區中,並且實際上只是週期性地將其寫入文件(當它足夠大以致值得)時,這稱爲flushing

如果在刷新數據之前將作者簡單地丟棄,則文件將不會更新。

您可以手動調用flush(),但很少需要 - 在調用器上調用close()不僅會釋放其所有資源,還會刷新緩衝區。因此,對於上面列出的try/finally模式,它的保證無論您在try塊中寫入的內容是否會在您的進程終止時寫入該文件。用你當前的代碼,沒有保證,這取決於作者的實現。