В руководстве и некоторых ответах StackOverflow они утверждали, что FileInputStream не буферизован.это правда?
Запись в любой файл буферизируется ОС, однако в этом случае она не буферизируется Java.Буферизация помогает, когда вы выполняете много маленьких записей, запись размером 1 КБ не маленькая.
В следующем коде FileInputStream используется для чтения данных в байтовый массив (1024 байта)
int len;
while ((len = fis.read(buffer))!= -1) {
fos.write(buffer);
}
Этот цикл прерывается, так как предполагается, что вы всегда читаете ровно 1024 байта, а длина файла всегда кратна 1024.
Вместо этого вы должны записать прочитанную длину.
for (int len; (len = fis.read(buffer))!= -1; )
fos.write(buffer, 0, len);
Если они оба буферизованы, они оба помещают данные в буфер и извлекают данные из буфера, где именно находится место, которое делает BufferedInputStream быстрее, чем FileInputStream?
В этом случае BufferedInputStream будет использовать буфер 8 КБ по умолчанию.Это сократит количество системных вызовов до 8 раз, однако в вашем случае было бы гораздо проще использовать 8 КБ byte[]
и сохранить несколько избыточных копий.
public static void main(String[] args) throws IOException {
try (FileInputStream fis = new FileInputStream("./fos.txt");
FileOutputStream fos = new FileOutputStream("./copy.txt")) {
byte[] buffer = new byte[8 << 10]; // 8 KB
for (int len; (len = fis.read(buffer)) != -1; )
fos.write(buffer, 0, len);
}
}