2017-06-16 29 views
0

我有下面的代碼:如何關閉嵌套的I/O流在Java中

try{ 
       fileOutputStream = new FileOutputStream(downloadFile1); 
       outputStream1 = new BufferedOutputStream(fileOutputStream); 

       boolean success = ftpclient.retrieveFile(completePath.get(i), outputStream1); 

       if (success) { 
        System.out.println(completePath.get(1)+" downloaded!"); 
       } 
      }finally { 
       if (outputStream1!=null) outputStream1.close(); 
       if(fileOutputStream!=null) fileOutputStream.close(); 

      } 

的IntelliJ是給錯誤FileOutputStream中需要過於封閉。

而如果我在改變流收盤順序finally塊

finally { 
    if(fileOutputStream!=null) fileOutputStream.close(); 
    if (outputStream1!=null) outputStream1.close(); 
       } 

那麼有沒有錯誤,但由於流被關閉未來的文件沒有完全下載。

有人可以建議正確的方法來做到這一點?

+0

嘗試用資源? – Eugene

+0

謝謝@eugene,你的建議確實奏效。使用試用資源似乎是一種更簡單的方法。 – avi

+0

同樣的事情是在答案建議,請接受它的情況下,幫助 – Eugene

回答

2

的BufferedOutputStream的close method(從FilterOutputStream中繼承)的文檔說

FilterOutputStream的接近方法調用其flush方法,然後調用它的基本輸出流的close方法。

所以IntelliJ顯然是錯誤的。如果有疑問請相信文檔,而不是IDE的警告 - 由於某種原因,它們是警告而不是錯誤。

也就是說,你應該使用try-with-resources聲明。

而且您也不需要中間變量,您可以構建FOS並立即將其作爲參數傳遞給BOS構造函數。

+0

感謝@ the8472的信息,我試着用資源工作得很好。 – avi

1

你應該使用try-與資源:

private static void printFileJava7() throws IOException { 

    try( FileInputStream  input   = new FileInputStream("file.txt"); 
      BufferedInputStream bufferedInput = new  BufferedInputStream(input) 
    ) { 

     int data = bufferedInput.read(); 
     while(data != -1){ 
     System.out.print((char) data); 
     data = bufferedInput.read(); 
    } 
} 

參見: