java 传统IO处理特别麻烦,Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源。
旧代码风格:
public static void main(String[] args) {
InputStream inputStream = null;
try {
inputStream = new FileInputStream("data.txt");
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我们看到,需要在finally手动关闭流,关闭还可能抛异常,又得处理,非常繁杂。
java7 风格
public static void main(String[] args) {
try (InputStream inputStream = new FileInputStream("data.txt")){
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
当try语句块运行结束时,FileInputStream 会被自动关闭。这是因为FileInputStream 实现了java中的java.lang.AutoCloseable接口。所有实现了这个接口的类都可以在try-with-resources结构中使用。
如果有多个资源,按顺序声明,使用;
分开:
public static void main(String[] args) {
try (InputStream inputStream = new FileInputStream("data.txt");
BufferedInputStream bis = new BufferedInputStream(inputStream)) {
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
AutoClosable 上面提到,FileInputStream实现了AutoClosable接口,可以自定义,如下:
public class Test {
public static void main(String[] args) {
try (TestAutoClose test = new TestAutoClose()) {
test.doSomething();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class TestAutoClose implements AutoCloseable {
public void doSomething() {
System.out.println("do something");
}
@Override
public void close() throws Exception {
System.out.println("TestAutoClose close");
}
}
do something TestAutoClose close