Я не думаю, что спецификация JVM дает какие-то гарантии об этом. Вы действительно должны finally
закрыть эти ресурсы.
Когда процесс завершится, операционная система освободит все связанные с ней ресурсы (включая память, дескрипторы файлов и сетевые сокеты).
Есть объекты ОС для проверки открытых файлов и потоков, таких как lsof
.
Нет гарантии, что ресурсы будут закрыты до тех пор, пока работает JVM, ваша предлагаемая реализация довольно опасна.
Что я хотел бы предложить. Сделайте класс A закрытым и используйте tryResourceClose-Statement Java. Пример здесь. https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
После выхода из блока try вы получаете возможность закрыть свои ресурсы.
Сам поток обычно не знает, открыта ли она или нет. Тем не менее, ваш собственный класс A может отслеживать, что потоки были закрыты или нет.
В случае FileInputStream
существует метод finalize()
, который освободит ресурсы, когда поток будет собран мусором.
Не то, чтобы вы могли или должны полагаться на это. Это то, что делает FileInputStream
. SocketInputStream
с другой стороны переопределяет finalize()
, чтобы явно ничего не делать, полагаясь на Socket
, чтобы закрыть ресурсы (и Socket
не имеет метода finalize()
).
Это плохая практика программирования, ошибка программиста. В зависимости от исходного источника данных он может никогда не закрыться, и у вас могут быть утечки. Вы должны закрыть любой ресурс, когда закончите с ним, в блоке finally
или используете попытку с ресурсами, если Java 7 или выше, чтобы убедиться, что он закрыт, даже если выбрано исключение.
InputStream in;
OutputStream out;
try {
// Do your stuff with the streams
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
Если вы не клонируете его вручную, тогда все неуправляемые ресурсы будут освобождены, когда процесс завершится, но это не рекомендуется или лучше. Вы всегда должны закрыть свой поток, как только вы закончите с ним.
Лучшим и предлагаемым способом управления потоком является использование опции try с ресурсом, например:
try (InputStream input = new FileInputStream(...);
Reader reader = new InputStreamReader(input, ...)) {
...
}
Я не закрывал потоки. Будет ли он автоматически закрываться после завершения задания ссылки на класс A?
blockquote>Нет, он не будет закрываться автоматически.
Хорошая ссылка на следующее:
Улучшение управления ресурсами с помощью Java SE 7: Вне синтаксического сахара
С помощью Java 7 вы можете создать один или несколько «ресурсов» в заявлении try. «Ресурсы» - это то, что реализует интерфейс java.lang.AutoCloseable. Этот ресурс будет автоматически закрыт и конец блока try.
вы можете посмотреть этот и java doc для получения дополнительной информации
private static void printFileJava7() throws IOException {
try(FileInputStream input = new FileInputStream("file.txt")) {
int data = input.read();
while(data != -1){
System.out.print((char) data);
data = input.read();
}
}
}
Когда блок try заканчивается, FileInputStream будет автоматически закрыт. Это возможно, потому что FileInputStream реализует интерфейс Java java.lang.AutoCloseable. Все классы, реализующие этот интерфейс, могут быть использованы внутри конструкции try-with-resources.