前言
在jdk1.7以前,io的操作都是要关流的,而经常有些码农就会忘记关流(比如说我),从而造成资源的浪费,降低系统性能。但值的高兴的是,在jdk1.7以后就不用关流了,流会自动关闭,,这样一来,我们就不用担心关流的问题了。就在刚出版的jdk1.9中又对jdk1.7中的方式又做新的更新,先不急了解新写法,我们先从jdk1.7之前出现,看看之前关流的做法是怎样的。
tip:如果想使用这种糖语法关流,就必须实现AutoColseable接口,才可以自动关流
AutoColseable接口源码:
public interface AutoCloseable {
void close() throws Exception;
}
JDK1.7之前关流方式
jdk1.7之前,在finally块(并不一定要在finally块中)中执行close()方法,关闭流并释放与该流关联的所有系统资源。这样一来,每打开一个连接,就要关一次连接。
public static void testBuffered(File file) throws IOException {
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new FileInputStream(file));
byte[] b = new byte[bis.available()];
bis.read(b);
System.out.println("使用缓冲字节输入流读取到的结果如下:"+new String(b));
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
//关闭流
bis.close();
}
}
或者使用工具包,稍微简洁一些:
InputStream is=null;
InputStreamReader isr=null;
BufferedReader read=null;
try {
is = new FileInputStream(new File(""));
isr = new InputStreamReader(is);
read = new BufferedReader(isr);
String s = read.readLine();
} finally {
IOUtils.closeQuietly(read,isr,is);
}
JDK1.7新语法
在JDK1.7以前,Java没有自动关闭外部资源的语法特性,直到JDK7中新增了try-with-resource语法,才实现了这一功能。简单的demo我也写了一个,放在下面...
public class Java7 {
public static void main(String[] args) {
File file = new File("D:"+File.separator+"test.txt");
try(FileInputStream fis = new FileInputStream(file);){
byte[] b = new byte[fis.available()];
fis.read(b);
System.out.println("文件读取内容如下:"+new String(b));
} catch (IOException e) {
e.printStackTrace();
}
}
}
只要把需要关流的操作写在try()中就可以不用关流,不需要关流的操作(准确来说是没有实现AtuoColseable接口的类),不能写在try()中,否则报错。
JDK1.9新语法
JDK9发布后,又简化了try-with-resources语句的用法。try()里面可以是一个变量,但必须是final的或者等同final才行。如下面的mis,mos定义成局部变量可以不用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();
}
简略的谈一下个人对9的语法的感觉,总体来来说,比7的版本的中的语法看的让人更舒服,然后就是没有什么太大的区别了。说白了这些语法糖,表面上我们没有手动关流,其实在运行期间,还是调用close()方法进行关流的,只是这一步不用我们去做了。
总结
闲话不多扯,做个总结,总之要想实现自动关流,还是想看连接类有没有实现AutoColseable这个接口,具体可以查看源码,这里不作详细解释。