Сколько файлов за один раз запрашивается у жесткого диска при последовательном чтении в Java?

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

Ответ

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

Ключевые факторы:

  1. Буферизация: При использовании BufferedReader, BufferedInputStream или Files.newBufferedReader() JVM читает данные блоками. Размер буфера по умолчанию часто составляет 8 КБ, но его можно настроить.
  2. NIO API: При работе с java.nio (FileChannel, ByteBuffer) разработчик явно управляет размером буфера.
  3. Операционная система и железо: ОС и драйверы диска могут выполнять дополнительное кэширование и предварительную выборку (read-ahead), запрашивая больше данных, чем указано в вызове приложения.

Пример с настраиваемым буфером:

import java.nio.*;
import java.nio.channels.*;
import java.nio.file.*;

try (FileChannel channel = FileChannel.open(Paths.get("data.bin"))) {
    // Явное указание размера буфера (например, 16 КБ)
    ByteBuffer buffer = ByteBuffer.allocate(16 * 1024);
    while (channel.read(buffer) != -1) {
        buffer.flip();
        // Обработка данных в буфере
        buffer.clear();
    }
}

Практический вывод: За один системный вызов запрашивается один блок данных (размером с буфер) из одного файла. Параллельные потоки (например, Files.lines().parallel()) могут читать несколько частей файла одновременно, но это реализуется на уровне потоков, а не как множественные запросы к диску от одного потока.