Главная » Java » Буферизированные  потоки

0

Итак,   сейчас   мы  считываем   и   записываем   файлы  побайтно.   Это означает, что  для  чтения файла длиной  в 1000 байт, программа ByteReader  должна  будет  обратиться  к  диску  1000  раз.  Но  работа  с данными  на   диске   происходит   значительно   медленнее,   чем   в оперативной  памяти.   Для минимизации количества обращений к диску,  Java   предоставляет   так  называемые   буферы,   нечто   вроде "резервуаров для данных". Класс BufferedInputStream позволяет быстро заполнить буфер в памяти данными  из  FileInputStream. Буферизированный  поток считывает  большую  порцию  байтов  из  файла  в  память  за  раз,  после чего  метод  read()  получает  отдельные  байты из  буфера  намного быстрее.

В  программе  можно  соединять  потоки,  так  же,  как водопроводчик соединяет   трубы.  Давайте  немного  изменим  пример,  который считывает  файл. Сначала, данные из  потока FileInputStream будут поступать в  BufferedInputStream,  а потом — методу read(): FileInputStream myFile = null; BufferedInputStream buff =null; try {

myFile = new  FileInputStream("abc.dat");

// соединяем потоки FileInputStream и BufferedInputStream

buff = new BufferedInputStream(myFile);

while (true) {

int byteValue = buff.read(); System.out.print(byteValue + " ");

if (byteValue  == -1)

break;

}

} catch (IOException e) {

e.printStackTrace();

}finally{

try{

buff.close();

myFile.close();

} catch(IOException e1){

e1.printStackTrace();

}

}

А какого объема такой буфер? Это зависит от версии  JVM, например 600 байт, но его можно установить  и вручную.  Например,  для  установки размера   буфера в 5000 байтов, используйте конструктор с двумя аргументами:

BufferedInputStream buff = new BufferedInputStream(myFile, 5000);

  не  изменяют   способ   чтения,   а   просто ускоряют  его.

BufferedOutputStream   действует  аналогично,   но   только   он   не читает,  а пишет в буфер, используя класс FileOutputStream.int somedata[]= {56,230,123,43,11,37}; FileOutputStream myFile = null;

BufferedOutputStream buff =null;

try {

myFile = new  FileOutputStream("abc.dat");

// соединяем потоки

buff = new BufferedOutputStream(myFile);

for (int i = 0; i <somedata.length; i++){

buff.write(somedata[i]);

}

} catch (IOException e) {

e.printStackTrace();

}finally{

try{

buff.flush(); buff.close(); myFile.close();

} catch(IOException e1){

e1.printStackTrace();

}

}

Чтобы  быть уверенным, что все байты  из буфера были переданы  в файловый поток, после окончания

Источник: Java  Programming for Kids, Parents and Grandparents by Yakov Fain

По теме:

  • Комментарии