也许你们在使用流时由于未关闭、或者未正常关闭引起了不少问题。其实java7引入了自动关闭流机制,只是咱们未使用而已。java
public class AutoCloseTest {
public static void main(String[] args) throws IOException {
//将打开流代码放到try中
try (
BufferedReader br = new BufferedReader(
new FileReader("teacher.txt"));
PrintStream pr = new PrintStream(new FileOutputStream("a.txt"))
) {
//使用两个资源
System.out.println(br.readLine());
pr.println("我是要成为海贼王的男人");
}
}
}
复制代码
咱们直接将打开的流对象放到try的圆括号中,这样当流使用完毕时,会自动将流进行关闭。这样不只省事并且避免了自行关闭可能带来的错误。app
这么神奇吗?让咱们来掀开这层神秘面纱,看看是何方妖孽在此“做祟”。经过jd-gui工具,咱们打开jvm
class文件看看。工具
public class AutoCloseTest
{
public static void main(String[] args)
throws IOException
{
BufferedReader br = new BufferedReader(new FileReader("teacher.txt"));Throwable localThrowable6 = null;
try
{
PrintStream pr = new PrintStream(new FileOutputStream("a.txt"));Throwable localThrowable7 = null;
try
{
System.out.println(br.readLine());
pr.println("我是要成为海贼王的男人");
}
catch (Throwable localThrowable1)
{
localThrowable7 = localThrowable1;throw localThrowable1;
}
finally {}
}
catch (Throwable localThrowable4)
{
localThrowable6 = localThrowable4;throw localThrowable4;
}
finally
{
if (br != null) {
if (localThrowable6 != null) {
try
{
br.close();
}
catch (Throwable localThrowable5)
{
localThrowable6.addSuppressed(localThrowable5);
}
} else {
br.close();
}
}
}
}
}
复制代码
厉害了,jvm帮咱们作的更好,你们能够参考下以前本身写的关闭流程有没有问题。自动关闭流程也是同样的,先关闭后打开的流,由于若是先关闭先打开的,若是后打开的在使用先打开的,这就会引起异常。ui
这是由于java7引入了一个AutoCloseable接口。几乎java自带的全部使用到流的都实现了这个接口。下面是继承图。spa
咱们能够经过使用java7引入的自动关闭机制,将实现了AutoCloseable接口的流放到try块里打开,这样在使用完毕以后,流会自动正确关闭,今后告别流关闭异常。code