С какого объема файлов в Java требуется оптимизация операций ввода-вывода?

«С какого объема файлов в Java требуется оптимизация операций ввода-вывода?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

  1. Всегда используйте буферизацию для чтения/записи:

    // Текст
    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"))) {
        // Чтение буферизированными блоками
    }
  2. Потоковая обработка (Stream API) с NIO.2 – для файлов от десятков МБ:

    import java.nio.file.*;
    Files.lines(Paths.get("huge.log")) // Не загружает весь файл в память
         .filter(line -> line.contains("ERROR"))
         .forEach(System.out::println);
  3. Память, отображаемая в файл (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.