网站找到后台了 如何破解账号 密码,网站建设应该注意的设计要点,服装设计类网站,网站总体设计方案转载自 JDK9新特性实战#xff1a;简化流关闭新姿势。做Java开发的都知道#xff0c;每个资源的打开都需要对应的关闭操作#xff0c;不然就会使资源一直占用而造成资源浪费#xff0c;从而降低系统性能。
关于资源的关闭操作#xff0c;从JDK7-JDK9有了不少的提升及简化。…转载自 JDK9新特性实战简化流关闭新姿势。做Java开发的都知道每个资源的打开都需要对应的关闭操作不然就会使资源一直占用而造成资源浪费从而降低系统性能。
关于资源的关闭操作从JDK7-JDK9有了不少的提升及简化。
JDK6
在JDK6及之前每个资源都需要我们手动写代码关闭如
FileInputStream fis null;
byte[] buffer new byte[1024];
try {fis new FileInputStream(new File(E:\\Java技术栈.txt));while (fis.read(buffer) 0) {System.out.println(new String(buffer));}
} catch (Exception e) {e.printStackTrace();
} finally {if (fis ! null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}
}
资源打开使用完后必须在finally块中进行手动关闭我们有的同事做一个查询功能点打开了连接查询完后没有手动关闭最后造成连接池超出最大连接数而使系统功能堵塞。JDK7JDK7发布后添加了新特性try-with-resources语句。所有需要关闭的资源只要实现了 java.lang.AutoCloseablejava.io.Closeable就实现了这个接口接口就在会程序结束后自动关闭。
如上面的读取文件的流程序用JDK7来写
byte[] buffer new byte[1024];
try (FileInputStream fis new FileInputStream(new File(E:\\Java技术栈.txt))) {while (fis.read(buffer) 0) {System.out.println(new String(buffer));}
} catch (Exception e) {e.printStackTrace();
}
所有的资源在 try()里面定义并去掉了finally模块。下面我们来写一个自定义的流来看看是否自动关闭了。
定义一个自定义输入输出流
class MyInputStream implements AutoCloseable {void read(String content) {System.out.println(read content content);}Overridepublic void close() throws Exception {System.out.println(input stream is closed.);}}class MyOutputStream implements AutoCloseable {void write(String content) {System.out.println(write content content);}Overridepublic void close() throws Exception {System.out.println(out stream is closed.);}}
单个资源自动关闭
try (MyInputStream mis new MyInputStream()) {mis.read(7_2);
} catch (Exception e) {e.printStackTrace();
}
输出read content 7_2input stream is closed.
多个资源自动关闭
try()里面可以定义多个资源它们的关闭顺序是最后在 try()定义的资源先关闭。
try (MyInputStream mis new MyInputStream(); MyOutputStream mos new MyOutputStream()) {mis.read(7_3);mos.write(7_3);
} catch (Exception e) {e.printStackTrace();
}
输出
read content 73write content 73out stream is closed.input stream is closed.JDK9
JDK9发布后又简化了try-with-resources语句的用法。
try()里面可以是一个变量但必须是final的或者等同final才行。如下面的mismos定义成局部变量可以不用final局部变量可以等同于final但定义成成员变量就必须是用final修饰的不然会编译错误。
MyInputStream mis new MyInputStream();
MyOutputStream mos new MyOutputStream();
try (mis; mos) {mis.read(1.9);mos.write(1.9);
} catch (Exception e) {e.printStackTrace();
}
输出
read content 1.9write content 1.9out stream is closed.input stream is closed.再来看个例子
Connection dbCon DriverManager.getConnection(url, user, password);
try (dbCon; ResultSet rs dbCon.createStatement().executeQuery(select * from emp)) {while (rs.next()) {System.out.println(In loadDataFromDB() rs.getString(1));}
} catch (SQLException e) {System.out.println(Exception occurs while reading the data from DB - e.getMessage());
}
dbCon和rs都能被自动关闭。
JKD9虽然简化了但感觉还是没有什么质的变化实际用途我们可能不希望关心资源的关闭或者在方法结束之后如果是局部变量它就能自动关闭。或许是我站的高度不够官方有其他的考量但JDK9的这一点变化还是非常有用的。