Я ожидал, что моя программа выдаст исключение типа
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
Мобильная версия