这一点其实深有感触。话不多说,先上代码:
static String firstLineOfFile(String path) { BufferedReader bufferedReader = null; try { bufferedReader = new BufferedReader(new FileReader(path)); return bufferedReader.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (null != bufferedReader) { bufferedReader.close(); } } catch (IOException e) { e.printStackTrace(); } } return ""; }
这是一个完整的读取一个文件的第一行字符的代码。
核心其实就两句:
bufferedReader = new BufferedReader(new FileReader(path)); return bufferedReader.readLine();
但是为了能够正确的关闭各种资源,代码变得异常冗长。
在Java 7引入try-with-resources之后,所有的问题便得到了解决:
当一个资源类实现了AutoCloseable的时候,我们可以使用try-with-resource自动管理资源
先看代码:
static String firstLineOfFileNew(String path) { try (BufferedReader bufferedReader = new BufferedReader(new FileReader(path))) { return bufferedReader.readLine(); } catch (IOException e) { e.printStackTrace(); } return ""; }
这种版本比原始的版本精简的多,而且try-with-resource对close方法进行了异常抑制:当对外部资源进行处理(例如读或写)时,如果遭遇了异常,且在随后的关闭外部资源过程中,又遭遇了异常,那么你catch到的将会是对外部资源进行处理时遭遇的异常,关闭资源时遭遇的异常将被“抑制”但不是丢弃,通过异常的getSuppressed方法,可以提取出被抑制的异常。这样能够让开发者更快的定位到异常