Буферизованный ввод/вывод
Операции ввода/вывода по сравнению с операциями в оперативной памяти выполняются очень медленно. Для компенсации в оперативной памяти выделяется некоторая промежуточная область – буфер, в которой постепенно накапливается информация. Когда буфер заполнен, его содержимое быстро переносится процессором, буфер очищается и снова заполняется информацией.
Житейский пример буфера – почтовый ящик, в котором накапливаются письма. Мы бросаем в него письмо и уходим по своим делам, не дожидаясь приезда почтовой машины. Почтовая машина периодически очищает почтовый ящик, перенося сразу большое число писем. Представьте себе город, в котором нет почтовых ящиков, и толпа людей с письмами в руках дожидается приезда почтовой машины.
Классы файлового ввода/вывода не занимаются буферизацией. Для этой цели есть четыре специальных класса BufferedXxx, перечисленных выше. Они присоединяются к потокам ввода/вывода как "переходное кольцо", например:
BufferedReader br = new BufferedReader(isr); BufferedWriter bw = new BufferedWriter(fw);
Потоки isr и fw определены выше.
Программа листинга 18.3 читает текстовый файл, написанный в кодировке СР866, и записывает его содержимое в файл в кодировке KOI8_R. При чтении и записи применяется буферизация. Имя исходного файла задается в командной строке параметром args[0], имя копии – параметром argstl].
Листинг 18.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."); } }