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(); } } }