Почему моя Java-программа с тысячами незакрытых FileWriters по-прежнему печатает «Готово», не выдавая ошибку? [закрыто]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему моя Java-программа с тысячами незакрытых FileWriters по-прежнему печатает «Готово», не выдавая ошибку? [закрыто]

Сообщение Anonymous »

Я экспериментировал с обработкой файлов Java и утечками ресурсов.
Я ожидал, что моя программа выдаст исключение типа
java.io.IOException: Слишком много открытых файлов
поскольку я открываю тысячи объектов FileWriter, не закрывая их — но она завершается успешно и выводит «Готово!».
вот мой код,

Код: Выделить всё

import java.io.*;
import java.util.*;

public class FileLeakTest {
public static void main(String[] args) {
ArrayList writers = new ArrayList(); // keep references alive(safe from GC)
try {
for (int i = 0; i < 100000; i++) {
FileWriter writer = new FileWriter("Test/example" + i + ".txt");
writer.write("Line " + i + "\n");
writers.add(writer);
}
System.out.println("Done!");
} catch (IOException e) {
System.out.println("Error: " + e);
}
}
}
Чего я ожидал
Поскольку я открываю 100 000 файлов без вызова close(), я думал, что в ОС закончатся файловые дескрипторы и выдаст исключение.
Что на самом деле происходит
Программа выводит «Готово!»
Все 100 000 файлов создаются
Исключения не создаются
Что я сделал попробовал
Сохранять ссылки на записи в ArrayList (чтобы предотвратить сбор мусора)
Использовать add = true
Записывать больше данных в каждый файл
Наблюдать за файлами с помощью lsof — но он не показывал много открытых дескрипторов
Тем не менее, никаких исключений не происходит.
Мой вопрос
Почему это не вызывает ошибку типа «Слишком много открытых» файлы»?
Java автоматически закрывает файлы «под капотом»?
Или ОС в этом случае обрабатывает дескрипторы файлов по-другому?
Я также был бы признателен за объяснение того, что на самом деле происходит на уровне OS/JVM.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -print-don
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»