Java类库里包含了必须通过调用close方法来手动关闭的资源。比如InputStream,OutputStream还有java.sql.Connection。
关闭资源这个动作通常被客户端忽视了,其性能表现也可想而知。虽然大部分这些资源都使用终结方法作为最后的安全线,但终结方法的效果并不是很好。
Java SE 7之前
在过去(Java7之前)的实践当中,try-finally语句是保证一个资源被恰当关闭的最好的方式,即使是在程序抛出异常或者返回的情况下:
// try-finally - No longer the best way to close resources!
static String firstLineOfFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
br.close();
}
}复制代码
这么做看起来可能还没什么问题,但当你添加第二个资源时,情况就开始变得糟糕了:
// try-finally is ugly when used with more than one resource!
static void copy(String src, String dst) throws IOException {
InputStream in = new FileInputStream(src);
try {
OutputStream out = new FileOutputStream(dst);