Для оптимизации операций ввода-вывода используются буферизуемые потоки. Эти потоки добавляют к стандартным специальный буфер в памяти, с помощью которого повышается производительность при чтении и записи потоков.
Класс BufferedInputStream накапливает вводимые данные в специальном буфере без постоянного обращения к устройству ввода. Класс BufferedInputStream определяет два конструктора:
BufferedInputStream(InputStream inputStream) BufferedInputStream(InputStream inputStream, int bufSize)
Первый параметр - это поток ввода, с которого данные будут считываться в буфер. Второй параметр - размер буфера.
Например, буферизируем считывание данных из потока ByteArrayInputStream:
import java.io.*; public class Program { public static void main(String[] args) { String text = "Hello world!"; byte[] buffer = text.getBytes(); ByteArrayInputStream in = new ByteArrayInputStream(buffer); try(BufferedInputStream bis = new BufferedInputStream(in)){ int c; while((c=bis.read())!=-1){ System.out.print((char)c); } } catch(Exception e){ System.out.println(e.getMessage()); } System.out.println(); } }
Класс BufferedInputStream в конструкторе принимает объект InputStream
. В данном случае таким объектом является экземпляр класса
ByteArrayInputStream
.
Как и все потоки ввода BufferedInputStream обладает методом read()
, который считывает данные. И здесь мы считываем с помощью метода read
каждый байт из массива buffer.
Фактические все то же самое можно было сделать и с помощью одного ByteArrayInputStream, не прибегая к буферизированному потоку. Класс BufferedInputStream просто оптимизирует производительность при работе с потоком ByteArrayInputStream. Естественно вместо ByteArrayInputStream может использоваться любой другой класс, который унаследован от InputStream.
Класс BufferedOutputStream аналогично создает буфер для потоков вывода. Этот буфер накапливает выводимые байты без постоянного обращения к устройству. И когда буфер заполнен, производится запись данных.
BufferedOutputStream определяет два конструктора:
BufferedOutputStream(OutputStream outputStream) BufferedOutputStream(OutputStream outputStream, int bufSize)
Первый параметр - это поток вывода, который унаследован от OutputStream, а второй параметр - размер буфера.
Рассмотрим на примере записи в файл:
import java.io.*; public class Program { public static void main(String[] args) { String text = "Hello world!"; // строка для записи try(FileOutputStream out=new FileOutputStream("notes.txt"); BufferedOutputStream bos = new BufferedOutputStream(out)) { // перевод строки в байты byte[] buffer = text.getBytes(); bos.write(buffer, 0, buffer.length); } catch(IOException ex){ System.out.println(ex.getMessage()); } } }
Класс BufferedOutputStream в конструкторе принимает в качестве параметра объект OutputStream - в данном случае это файловый поток вывода FileOutputStream. И также производится запись в файл. Опять же BufferedOutputStream не добавляет много новой функциональности, он просто оптимизирует действие потока вывода.