Введение
Возможно, у вас много проблем при использовании потоков, потому что они не закрыты или закрыты неправильно. На самом деле в java7 появился механизм автоматического закрытия потока, но мы его не использовали.
Во-вторых, пример потока автоматического закрытия
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("我是要成为海贼王的男人");
}
}
}
Мы помещаем объект открытого потока прямо в круглые скобки попытки, чтобы, когда поток израсходован, поток автоматически закрывался.Это не только избавляет от проблем, но и позволяет избежать ошибок, которые могут быть вызваны самозакрыванием.
3. Принцип исследования
Это так удивительно? Давайте приоткроем эту загадочную завесу и посмотрим, где здесь «работает» злодей. Через инструмент jd-gui открываем
посмотрите файл класса.
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 помогает нам работать лучше, вы можете обратиться к процессу выключения, который вы написали ранее, если возникнут какие-либо проблемы. Процесс автозакрытия тот же, поток, который сначала закрывается, а затем открывается, потому что если тот, который был открыт первым, закрывается первым, и если тот, который был открыт позже, использует тот, который был открыт первым, это будет сгенерировать исключение.
Почему он автоматически закрывается?
Это связано с тем, что в java7 появился интерфейс AutoCloseable. Почти все, что поставляется с java, использующим потоки, реализует этот интерфейс. Ниже приведена схема наследования.
4. Резюме
Мы можем открыть поток, который реализует интерфейс AutoCloseable в блоке try, используя механизм автоматического закрытия, введенный java7, так что после завершения использования поток будет автоматически правильно закрыт и попрощается с исключением закрытия потока.