Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Выбор файлов
Простейший редактор текста
Копирование файлов UNICODE
Сохранение объекта Java в файле
Произвольные классы и файлы
Буферизация потоков
Разбор конфигура-
ционного файла

Работа с консолью
Работа с классом PrintWriter
Разбор строк класса String
Загрузка и просмотр изображений
Потоки в оперативной памяти
Конвейерные потоки
Комбинирование двух потоков
Комбинирование нескольких потоков
Поиск слова в текстовом файле
Произвольный доступ к файлу
Информация о файле
Работа с каталогами
Просмотр содержимого каталога
Просмотр каталога с фильтром
Панель для выбора каталога
Список системных свойств
Сохранение списка системных свойств
Контрольная сумма файла
Копирование, переименование, удаление файлов
Архивы ZIP
Создание архива ZIP
Распаковка архива ZIP
Обход дерева каталогов

Назад Вперед

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);

Назад Вперед

[Назад]