如何在Java中关闭嵌套的I / O流

时间:2017-06-16 17:04:23

标签: java java-io

我有以下代码:

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();
                }

然后没有错误,但文件没有完全下载,因为前面关闭了流。

有人可以建议正确的方法吗?

2 个答案:

答案 0 :(得分:2)

BufferedOutputStream close method的文档(继承自FilterOutputStream)说

  

FilterOutputStream的close方法调用其flush方法,然后调用其底层输出流的close方法。

所以IntelliJ显然是错误的。如果有疑问,请相信文档,而不是IDE的警告 - 它们是警告而不是错误。

那就是说,你应该使用try-with-resources声明。

并且您也不需要中间变量,您可以构造FOS并立即将其作为参数传递给BOS构造函数。

答案 1 :(得分:1)

您应该使用try-with-resources:

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();
    }
}

见: