jdk7之前的写法try-catch-finally
package com.wjz.jdk7.before;
import java.io.*;
public class TryCatchFinally {
private static final String src = "D:/src.txt";
private static final String dst = "D:/dst.txt";
public static void main(String[] args) {
copy(src, dst);
System.out.println("复制成功!");
}
public static void copy(String src, String dst) {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(src);
out = new FileOutputStream(dst);
byte[] buff = new byte[1024];
int n;
while ((n = in.read(buff)) >= 0) {
out.write(buff, 0, n);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
jdk7之后的写法try-with-resources
package com.wjz.jdk7.after;
import java.io.*;
/**
* try-with-resources 声明要求其中定义的变量实现 AutoCloseable 接口,
* 这样系统可以自动调用它们的close方法从而替代了finally中关闭资源的功能,
* 甜甜的语法糖
*/
public class TryWithResources {
private static final String src = "D:/src.txt";
private static final String dst = "D:/dst.txt";
public static void main(String[] args) {
copy(src, dst);
System.out.println("复制成功!");
}
public static void copy(String src, String dst) {
try (InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst)) {
byte[] buff = new byte[1024];
int n;
while ((n = in.read(buff)) >= 0) {
out.write(buff, 0, n);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
自定义资源
package com.wjz.jdk7.autoclose;
import java.io.IOException;
public class Resource implements AutoCloseable {
public void sayHello() {
System.out.println("hello");
}
@Override
public void close() throws IOException {
System.out.println("Resource is closed");
}
public static void main(String[] args) {
try (Resource r = new Resource()) {
r.sayHello();
} catch (IOException e) {
e.printStackTrace();
}
}
}