我有以下代码:
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 :(得分: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();
}
}
见: