Назад
Вперед
7.6. Буферизация потоков
Пример показывает использование
буферизованных потоков классов BufferedInputStream и
BufferedOutputStream для копирования файлов.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
В ряде случаев вы можете значительно ускорить
работу приложения с файлами, воспользовавшись
буферизацией потоков Java.
В библиотеке java.io.* предусмотрены классы
BufferedOutputStream и BufferedInputStream, специально
предназначенные для буферизации ввода/вывода
приложений Java.
Как ими пользоваться?
Очень просто. Вы можете передать конструкторам
этих классов ссылки на потоки, которые
необходимо буферизовать. Это могут быть,
например, потоки классов FileOutputStream и FileInputStream,
привязанные к файлам:
BufferedOutputStream bos;
bos = new BufferedOutputStream(
new FileOutputStream("myfile.txt"));
Здесь мы создаем выходной поток класса
FileOutputStream, связанный с файлом myfile.txt, а затем на
базе этого потока создаем буферизованный поток
bos класса BufferedOutputStream.
Буферизованные потоки классов BufferedOutputStream и
BufferedInputStream можно использовать в качестве
исходных для создания форматированных потоков
вывода и ввода классов DataOutputStream и DataInputStream,
например:
DataOutputStream dos;
dos = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("myfile.txt")));
В классе BufferedOutputStream определен метод flush,
выполняющий принудительную запись
буферизованных данных на диск. Такую операцию
необходимо выполнять для того чтобы убедиться,
что выведенные в буферизованный поток данные
оказались записанными на диск. Учтите, однако,
что операционная система может выполнять свою
собственную буферизацию ввода/вывода.
Существуют также кеш-контроллеры дисковых
устройств, которые тоже занимаются буферизацией.
Описание примера
Автономное приложение BufferedFileCopy выполняет
копирование файлов по символам с использованием
буферизации.
Опишем только существенные детали.
Прежде всего приложение выводит на экран
стандартную диалоговую панель выбора входного
файла:
FileDialog fdlg;
fdlg = new FileDialog(fr, "Source file");
fdlg.show();
String szSourceFilename;
szSourceFilename = fdlg.getDirectory() +
fdlg.getFile();
Путь к файлу записывается в переменную
szSourceFilename.
Далее аналогичная операция выполняется для
результирующего файла:
fdlg = new FileDialog(fr, "Save file as...",
FileDialog.SAVE);
fdlg.show();
String szDestFilename;
szDestFilename = fdlg.getDirectory() +
fdlg.getFile();
На следующем шаге приложение создает потоки
для форматированного ввода и вывода:
DataInputStream dis = null;
DataOutputStream dos = null;
Эти потоки создаются на базе потоков BufferedInputStream
и BufferedOutputStream, которые в свою очередь образуются
на базе потоков классов FileInputStream и FileOutputStream:
try
{
dis = new DataInputStream(
new BufferedInputStream(
new FileInputStream(szSourceFilename)));
dos = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(szDestFilename)));
}
catch (IOException ex)
{
System.out.println(ex.toString());
System.exit(0);
}
Копирование файлов выполняется в цикле:
while(true)
{
try
{
dos.writeChar(dis.readChar());
}
catch (EOFException ex)
{
break;
}
catch (IOException ex)
{
System.out.println(ex.toString());
break;
}
}
Условием завершения цикла является
возникновение исключения EOFException при попытке
чтения за концом исходного файла.
Перед завершением работы приложение закрывает
оба потока:
try
{
dis.close();
dos.close();
}
catch (IOException ex)
{
System.out.println(ex.toString());
System.exit(0);
}
При закрытии выходного буферизованного потока
содержимое буфера записывается на диск, поэтому
нам здесь не нужно вызывать явным образом метод
flush.
После закрытия потоков приложение завершает
свою работу:
System.exit(0);
Назад Вперед |