FileInputStream не буферизуется и почему BufferedInputStream быстрее? - PullRequest
0 голосов
/ 04 октября 2018

о IO, у меня два вопроса.

A.В руководстве и некоторых ответах StackOverflow они утверждали, что FileInputStream не буферизируется.Это правда?

В следующем коде используется FileInputStream для чтения данных в байтовый массив (1024 байта)

class Test {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("./fos.txt");
        FileOutputStream fos = new FileOutputStream("./copy.txt");

        byte[] buffer = new byte[1024];   // Is this a buffer ? 

        int len;
        while ((len = fis.read(buffer))!= -1) {
            fos.write(buffer);
        }

        fos.close();
        fis.close();
    }
}

Из API,есть одна строка:

public int read (byte b []) выбрасывает IOException

  • @ param b: буфер, в который считываются данные.

B.Если они оба буферизованы, они оба помещают данные в буфер и извлекают данные из буфера, где точно находится место, которое делает BufferedInputStream быстрее, чем FileInputStream?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

В руководстве и некоторых ответах 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);
    }
}
0 голосов
/ 04 октября 2018

Это правда, что FileInputStream не буферизуется, но он предоставляет ограниченные возможности, подобные буферу при чтении.

Самое большое отличие состоит в том, что BufferedInputStream поддерживает mark () и reset (), а FileInputStream - нет. *Отметка 1003 *

(int readlimit) позволит вам установить позицию в потоке для последующего использования.reset () установит вашу позицию в потоке на значение, указанное в mark (int readLimit)

Для поддержки mark () и reset () BufferedInputStream должен поддерживать внутренний буфер, где FileInputStream не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...