Java 1.7中新增的try-with-resource语法糖来打开资源,而无需码农们自己书写资源来关闭代码
为了能够配合try-with-resource,资源必须实现AutoClosable
接口。该接口的实现类需要重写close
方法:
public class ConnectionClone implements AutoCloseable {
public void sendData() {
System.out.println("正在发送数据");
}
@Override
public void close() throws Exception {
System.out.println("正在关闭连接");
}
}
public static void main(String[] args) {
try (ConnectionClone conn = new ConnectionClone()) {
conn.sendData();
} catch (Exception e) {
e.printStackTrace();
}
}
输出:
正在发送数据
正在关闭连接
public static void main(String[] args) {
InputStream is = new TryWithResource().f1();
byte[] data = new byte[1024];
try {
is.read(data);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件内容:" + new String(data));
}
public InputStream f1() {
File file = new File("D:\\00t1.txt");
try (InputStream is = new FileInputStream(file)) {
return is;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
java.io.IOException: Stream Closed
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:233)
原因:不要把InputStream当作返回类型,同一个流对象又要返回又要close是矛盾的!!!可以使用void,byte[],或者String
public static void main(String[] args) { // 指定构造文件
File file = new File("D:\\00t1.txt"); // 将文件构建为输入流
try (InputStream is = new FileInputStream(file)) { // 创建字节数组
byte[] data = new byte[1024]; // 从文件流中读取数据,存储到缓冲字节数组
is.read(data); // 输出文件内容
System.out.println("文件内容:" + new String(data));
} catch (IOException e) {
e.printStackTrace();
}
}
能正确读取。
关于异常:
public class ConnectionClone implements AutoCloseable {
/* public void sendData() {
System.out.println("正在发送数据");
}
@Override
public void close() throws Exception {
System.out.println("正在关闭连接");
}*/
public void sendData() throws Exception {//方法内抛出了一个异常,那么在这个方法内,需要catch处理或者继续向上抛出异常
throw new Exception("send data");
}
@Override
public void close() throws Exception {
throw new Exception("close");
}
}
public static void main(String[] args) {
try (ConnectionClone conn = new ConnectionClone()) {
conn.sendData();
} catch (Exception e) {
e.printStackTrace();
}
}
输出:
java.lang.Exception: send data
at testpackage.ConnectionClone.sendData(ConnectionClone.java:20)
at testpackage.TryWithResource.main(TryWithResource.java:17)
Suppressed: java.lang.Exception: close
at testpackage.ConnectionClone.close(ConnectionClone.java:25)
at testpackage.TryWithResource.main(TryWithResource.java:18)
从Java 1.7开始,大佬们为Throwable
类新增了addSuppressed
方法,支持将一个异常附加到另一个异常身上,从而避免异常屏蔽。
参考《深入理解 Java try-with-resource 语法糖》