logo
lab5

Буферизованный ввод/вывод

Операции ввода/вывода по сравнению с операциями в оперативной памяти выполняются очень медленно. Для компенсации в оперативной памяти выделяется некоторая промежуточная область — буфер, в которой постепенно накапливается информация. Когда буфер заполнен, его содержимое быстро переносится процессором, буфер очищается и снова заполняется информацией.

Житейский пример буфера — почтовый ящик, в котором накапливаются письма. Мы бросаем в него письмо и уходим по своим делам, не дожидаясь приезда почтовой машины. Почтовая машина периодически очищает почтовый ящик, перенося сразу большое число писем. Представьте себе город, в котором нет почтовых ящиков, и толпа людей с письмами в руках дожидается приезда почтовой машины.

Классы файлового ввода/вывода не занимаются буферизацией. Для этой цели есть четыре специальных класса BufferedXxx, перечисленных выше. Они присоединяются к потокам ввода/вывода как "переходное кольцо", например:

BufferedReader br = new BufferedReader(isr); 

BufferedWriter bw = new BufferedWriter(fw);

Потоки isr и fw определены выше.

Программа листинга 3 читает текстовый файл, написанный в кодировке СР866, и записывает его содержимое в файл в кодировке KOI8_R. При чтении и записи применяется буферизация. Имя исходного файла задается в командной строке параметром args[0], имя копии — параметром argstl].

Листинг 3. Буферизованный файловый ввод/вывод

import java.io.*;

class DOStoUNIX{

public static void main(String[] args) throws IOException{ 

if (args.length != 2){

System.err.println("Usage: DOStoUNIX Cp866file KOI8_Rfile"); 

System.exit(0);

}

BufferedReader br = new BufferedReader( 

new InputStreamReader(

new FileInputStream(args[0]), "Cp866")); 

BufferedWriter bw = new BufferedWriter( 

new OutputStreamWriter(

new FileOutputStreamtargs[1]), "KOI8_R")); 

int с = 0; 

while ((c = br.readO) != -1)

bw.write((char)c); 

br.closeO; bw.close();

System.out.println("The job's finished."); 

}