Ответ
Оптимизацию операций с файлами в Java следует начинать с объемов от нескольких мегабайт, особенно при частых или конкурентных операциях. Основные техники:
-
Всегда используйте буферизацию для чтения/записи:
// Текст try (BufferedReader br = new BufferedReader(new FileReader("large.txt"))) { String line; while ((line = br.readLine()) != null) { // Обработка строки } } // Бинарные данные try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("data.bin"))) { // Чтение буферизированными блоками } -
Потоковая обработка (Stream API) с NIO.2 – для файлов от десятков МБ:
import java.nio.file.*; Files.lines(Paths.get("huge.log")) // Не загружает весь файл в память .filter(line -> line.contains("ERROR")) .forEach(System.out::println); -
Память, отображаемая в файл (Memory-Mapped Files) – для файлов размером в гигабайты:
try (FileChannel channel = FileChannel.open(Paths.get("giant.bin"))) { MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); // Работа с буфером как с областью памяти }
Почему это важно: Прямой доступ к диску (без буфера) и загрузка всего файла в память (Files.readAllBytes) приводят к большим накладным расходам и могут вызвать OutOfMemoryError.