Ответ
При последовательном чтении одного файла Java обычно запрашивает данные одного файла за раз. Однако фактический объем данных, запрашиваемых за одну операцию ввода-вывода, зависит от используемого API и буферизации.
Ключевые факторы:
- Буферизация: При использовании
BufferedReader,BufferedInputStreamилиFiles.newBufferedReader()JVM читает данные блоками. Размер буфера по умолчанию часто составляет 8 КБ, но его можно настроить. - NIO API: При работе с
java.nio(FileChannel, ByteBuffer) разработчик явно управляет размером буфера. - Операционная система и железо: ОС и драйверы диска могут выполнять дополнительное кэширование и предварительную выборку (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()) могут читать несколько частей файла одновременно, но это реализуется на уровне потоков, а не как множественные запросы к диску от одного потока.