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-м случае?
Проще говоря, FileReader считывает весь файл, а BufferedReader "буферизирует" ввод. Полезно прочитать документацию по API Java :) Вы также можете проверить этот вопрос для получения дополнительной информации.
Какую ОС/JRE вы используете? Я не могу воспроизвести это на Ubuntu 18.04 с Java 8.0.202. Пробовал 100_000 чтений с FileReader() без проблем.
Вы создаете больше мусора, в частности массив 8 КБ, для каждого файла, поэтому включается GC, и финализация закрывает файл.




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