Java.io.FileNotFoundException (слишком много открытых файлов) FileReader против BufferedReader

Java-код:

for (int i=0; i<13000; i++){
    new FileReader("helloWorld.txt");
}

дает:

> Exception in thread "main" java.io.FileNotFoundException: helloWorld.txt (Too many open files)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
at java.base/java.io.FileReader.<init>(FileReader.java:60)
at Main.main(Main.java:14)

И это вполне нормально, так как системных ресурсов не хватает. Но я понятия не имею, почему это работает:

for (int i=0; i<13000; i++){
    new BufferedReader(new FileReader("helloWorld.txt"));
}

Поскольку даже между FileReader и BufferedReader есть много различий, все же есть: new FileReader("helloWorld.txt") - так не должен ли он выйти из ресурсов, как в 1-м случае?

почему в цикле new FileReader("helloWorld.txt");

Deadpool 09.03.2019 20:52

Проще говоря, FileReader считывает весь файл, а BufferedReader "буферизирует" ввод. Полезно прочитать документацию по API Java :) Вы также можете проверить этот вопрос для получения дополнительной информации.

Zephyr 09.03.2019 20:59

Какую ОС/JRE вы используете? Я не могу воспроизвести это на Ubuntu 18.04 с Java 8.0.202. Пробовал 100_000 чтений с FileReader() без проблем.

isapir 09.03.2019 21:07

Вы создаете больше мусора, в частности массив 8 КБ, для каждого файла, поэтому включается GC, и финализация закрывает файл.

user207421 09.03.2019 22:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
212
0

Другие вопросы по теме