Что на самом деле означает одновременное чтение файла в память?

#java #bufferedreader #bufferedinputstream

#java #bufferedreader #bufferedinputstream

Вопрос:

Меня смущает термин «Не считывать файл в память сразу». Для приведенного ниже кода будет правильно сказать, что я не читаю файл в память сразу, а построчно?

 File file = new File("C:\Users\Desktop\test.txt"); 
  
  BufferedReader br = new BufferedReader(new FileReader(file)); 
  
  String st; 
  while ((st = br.readLine()) != null) 
    System.out.println(st); 
  } 
} 
 

Комментарии:

1. Не имеет значения, читаете ли вы все сразу или построчно, скорее важно, заставляете ли вы среду выполнения сохранять все в памяти. Поскольку вы обрабатываете строки одну за другой, не сохраняя их дольше, чем необходимо, вы не поддались обескураживающему анти-шаблону. Но имейте в виду, что совет заключается в том, чтобы не хранить в памяти больше, чем необходимо, но если ваша задача требует, чтобы все было в памяти, то так оно и есть…

Ответ №1:

Для приведенного ниже кода будет правильно сказать, что я не читаю файл в память сразу, а построчно?

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

Ответ №2:

Для приведенного ниже кода будет правильно сказать, что я не читаю файл в память сразу, а построчно?

Да, это правильно. В этом коде вы не попадаете в анти-шаблон чтения файлов в память.

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

Комментарии:

1. Чтение файлов в память не является антишаблоном. Это совершенно нормально, если вы уверены в своем сценарии развертывания (количество и размер файлов, объем памяти).

2. Вероятно, вы согласны с тем, что чтение файла в память для его последовательной обработки является распространенным, но плохим начальным подходом. Как бы вы это назвали, если не антипаттером?