When handling some resources (InputStream, OutputStream, BufferedReader, etc.) in the try block, by calling the close method in the finally block before Java7, the resource regardless of whether the processing in the try block ended normally or abnormally. Was guaranteed to be closed securely. It looks like this:
protected void copy(String src, String dest) throws IOException {
InputStream in = new FileInputStream(src);
try {
OutputStream out = new FileOutputStream(dest);
try {
byte[] buf = new byte[100];
int n;
while ((n = in.read(buf)) >= 0) {
out.write(buf, 0, n);
}
} finally {
out.close();
}
} finally {
in.close();
}
}
In addition, there are also checks to make sure that an exception does not occur in the finally block.
} finally {
if (br != null)
try {
br.close();
} catch (IOException e) {
//Exception handling
}
}
However, there are some problems with these writing styles.
Java 7 introduced the try-with-resources syntax for these issues. The try-with-resources syntax solves these problems all at once.
Immediately after the try, describe the resource generation process to be closed. If there are multiple resources to be closed, separate them with a semicolon.
protected void copy(String src, String dest) throws IOException {
try (InputStream inputStream = new FileInputStream(src); OutputStream outputStream = new FileOutputStream(dest)) {
byte[] buf = new byte[100];
int n;
while ((n = in.read(buf)) >= 0) {
out.write(buf, 0, n);
}
}
}
By writing like this, the behavior will be as follows.
This solves the problems mentioned in "Problems with resource closing in try-finally".
Use try-with-resources rather than try-finally when dealing with resources that must be closed