betacode

Руководство Java BufferedInputStream

  1. BufferedInputStream
  2. mark() & reset()
  3. Examples

1. BufferedInputStream

BufferedInputStream являетсяподклассом InputStream, который используется для упрощения чтения текста из двоичных входных потоков (binary input stream) и повышения производительности программы.
Принцип работы BufferedInputStream выглядит следующим образом:
BufferedInputStream обертывает внутри него объект InputStream, который автоматически считывает данные из источника (например, файл) и сохраняет их в buffer (буфере) of BufferedInputStream.
BufferedInputStream переопределяет (override) методы, которые наследуются от его родительского класса, такие как read(), read(byte[]),...чтобы гарантировать, что они будут манипулировать данными из buffer, а не из источника (например, файла).
Так называемый "buffer", упомянутый выше, на самом деле является просто массивом byte. Объект InputStream (of BufferedInputStream) автоматически считывает bytes из источника для хранения в этом массиве.
BufferedInputStream считывает bytes из массива buffer и освобождает прочитанные места. Освобожденные места будут использоваться для хранения только что прочитанных bytes из источника.
BufferedInputStream constructors
BufferedInputStream​(InputStream in, int size)

BufferedInputStream​(InputStream in)
  • Конструктор BufferedInputStream(InputStream,int) создает объект BufferedInputStream с массивом buffer указанного размера.
  • Конструктор BufferedInputStream(InputStream) создает объект BufferedInputStream с массивом buffer размера по умолчанию (size = 8192).

2. mark() & reset()

Интересным аспектом BufferedInputStream является то, что он поддерживает mark() и reset(), два метода унаследованы от InputStream. Не все подклассы InputStream поддерживают эти два метода. В принципе, вы можете вызвать метод markSupported(), чтобы проверить, поддерживаются ли вышеуказанные 2 метода.
Более подробное объяснение методов mark() и reset() см. в статье о InputStream:

3. Examples

Чтобы создать объект BufferedInputStream, нам нужно создать объект InputStream для чтения данных из источника (например, из файла). Поскольку InputStream является абстрактным классом, вам необходимо создать его из одного из его подклассов.
Например: Создаем BufferedInputStream с размером массива buffer16384. Это означает, что размер этого buffer составляет 16384 bytes (16 KB).
// Create InputStream to read a file.
InputStream is = new FileInputStream("/Volumes/Data/test/test.txt");

// Create a BufferedInputStream with buffer array size of 16384 (16 KB).
BufferedReader br = new BufferedReader(is, 16384);
Создаем BufferedInputStream с размером массива buffer по умолчанию (8192), который эквивалентен 8192 bytes (8 KB).
// Create Reader to read a file.
Reader reader = new FileReader("/Volumes/Data/test/test.txt");

// Create a BufferedReader with default buffer array size of 8192 (16384 bytes = 16 KB).
BufferedReader br = new BufferedReader(reader);
Например: Использование BufferedInputStream для чтения файла.
test.txt
This is the Latin text
BufferedInputStreamEx1.java
package org.o7planning.bufferedinputstream.ex;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class BufferedInputStreamEx1 {

    // C:/test/test.txt
    private static String file_path = "/Volumes/Data/test/test.txt";
    
    public static void main(String[] args) throws IOException {
        File file = new File(file_path);
        InputStream is = new FileInputStream(file);

        BufferedInputStream bis = new BufferedInputStream(is);
        
        int code;
        while((code = bis.read())!= -1) {
            System.out.println(code +" " + (char)code);
        }
        bis.close();
    }
}
Output:
84 T
104 h
105 i
115 s
32  
105 i
115 s
32  
116 t
104 h
101 e
32  
76 L
97 a
116 t
105 i
110 n
32  
116 t
101 e
120 x
116 t
10
Например: Использование BufferedInputStream для чтения URL-адреса для повышения производительности программы.
BufferedInputStreamEx2.java
package org.o7planning.bufferedinputstream.ex;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class BufferedInputStreamEx2 {
    private static String urlString = "https://s3.o7planning.com/images/smile-32.png";

    public static void main(String[] args) throws IOException {
        URL url = new URL(urlString);
        InputStream is = url.openConnection().getInputStream();

        BufferedInputStream bis = new BufferedInputStream(is);

        int code;
        while ((code = bis.read()) != -1) {
            System.out.print((char) code);
        }
        bis.close();
    }
}

Руководства Java IO

Show More