Недавно я создал интерфейс, который заставляет пользователя реализовать один fromStream(OutputStream)
со своими методами по умолчанию, глядя, как это:Что делает чтение из файлов без буферов настолько дорогостоящим?
public default T fromFile(File file) throws IOException {
try (InputStream stream = new FileInputStream(file)) {
return fromStream(stream);
}
}
Вскоре после того, как выяснилось, что это было очень дорого (несколько секунд в МБ) из-за того, что одиночные байты непосредственно считываются из FileInputStream
.
Обертывание его в BufferedInputStream
решило мою проблему, но это оставило меня с вопросом, почему FileInputStream
так безумно дорого.
Канал файла не закрывается или не открывается при чтении байтов, так почему же в первую очередь необходимо использовать буферы?
Ну, очень бедная ОС может сделать это именно так, но каждая ОС, имеющая реализацию Java, имеет внутренние кэши системы файловой системы, которые блокируют блок данных с диска, поэтому блок не будет считаться снова. Но даже для чтения из кеша файловой системы требуется системный вызов, который имеет большие накладные расходы по сравнению с чем-либо, что остается внутри пользовательского процесса. См. Ответ Стивена. –