2017-06-16 30 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(); 
    } 
} 

参见: