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

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

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

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

Назад Вперед

7.3. Копирование файлов UNICODE

В примере демнострируется использование классов DataInputStream и DataOutputStream для копирования текстовых файлов, содержащих символы UNICODE.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Немного теории

Для выполнения форматного ввода или вывода удобно пользоваться классами DataOutputStream и DataInputStream, исключающими необходимость работать с файлами на уровне байт или блоков.

Следующий набор методов можно использовать для записи форматированных данных в поток класса DataOutputStream:

public final void writeBoolean(boolean v);
public final void writeByte(int v);
public final void writeBytes(String s);
public final void writeChar(int v);
public final void writeChars(String s);
public final void writeDouble(double v);
public final void writeFloat(float v);	
public final void writeInt(int v);
public final void writeLong(long v);
public final void writeShort(int v);
public final void writeUTF(String s);

Все перечисленные выше методы в случае возникновения ошибки создают исключение IOException, которое вы должны обработать.

В классе DataInputStream определены следующие методы, предназначенные для чтения форматированных данных из входного потока:

public final boolean readBoolean();
public final byte    readByte();
public final char    readChar();
public final double  readDouble();
public final float   readFloat();
public final void    readFully(byte b[]);
public final void    readFully(byte b[],
  int off, int len);
public final int     readInt();
public final String  readLine();
public final long    readLong();
public final short   readShort();
public final int     readUnsignedByte();
public final int     readUnsignedShort();
public final String  readUTF();
public final static String readUTF(
  DataInput in);
public final int     skipBytes(int n);

Методы класса DataInputStream, предназначенные для чтения данных, могут создавать исключения IOException и EOFException. Первое из них возникает в случае ошибки, а второе - при достижении конца входного потока в процессе чтения.

Описание примера

Ниже мы привели исходный текст автономного приложения Java, предназначенного для копирования текстовых файлов с символами UNICODE.

Главный класс приложения содержит всего один статический метод main:

import java.io.*;
import java.awt.*;
import java.awt.event.*;

public class CopyTxtFile
{
  public static void main(String args[])
  {
    . . .
  }
}

Внутри этого метода мы создаем объект класса Frame:

Frame fr = new Frame("");

Этот объект будет нам нужен для отображения стандартных диалоговых панелей выбора файлов. Мы не будем делать соответствующий фрейм видимым - сразу после запуска программы на экране появится диалоговая панель выбора исходного файла, а после ее закрытия - панель выбора результирующего файла.

Панель исходного файла создается и отображается как обычно:

FileDialog fdlg;
    
fdlg = new FileDialog(fr, "Source file");
fdlg.show();

Путь к исходному файлу сохраняется в переменной szSourceFilename:

String szSourceFilename;
szSourceFilename = fdlg.getDirectory() +
fdlg.getFile();

Далее мы получаем и сохраняем в переменной szDestFilename путь к результирующему файлу:

fdlg = new FileDialog(fr,
  "Save file as...", 
  FileDialog.SAVE);
fdlg.show();
    
String szDestFilename;
szDestFilename = fdlg.getDirectory() +
  fdlg.getFile();

Перед началом копирования приложение открывает потоки классов DataInputStream и DataOutputStream для выполнения операций форматного ввода/вывода:

DataInputStream dis  = null;    
DataOutputStream dos = null;    
    
try
{
  dis = new DataInputStream(
    new FileInputStream(szSourceFilename));
      
  dos = new DataOutputStream(
    new FileOutputStream(szDestFilename));
}
catch (IOException ex)
{
  System.out.println(ex.toString());
  System.exit(0);
}

Обратите внимание, что поток класса DataInputStream создается на базе потока класса FileInputStream, но это не есть наследование. Мы просто передаем конструктору класса DataInputStream ссылку на соответствующий объект класса FileInputStream. Создание потока DataOutputStream выполняется аналогично.

Если в процессе создания потоков происходит исключение IOException, мы выводим сообщение об ошибке и завершаем работу приложения.

Копирование файла выполняется в цикле:

while(true)
{
  try
  {
    dos.writeChar(dis.readChar());
  }
  catch (EOFException ex)
  {
    break;
  }
  catch (IOException ex)
  {
    System.out.println(ex.toString());
    break;
  }
}  

На каждой итерации приложение вначале читает один символ UNICODE методом readChar из входного потока dis, а затем записывает его в выходной поток dos методом writeChar. Условие завершения цикла - возникновение исключения при достижении конца исходного файла EOFException.

Если же в процессе копирования возникает исключение IOException, то мы выводим сообщение об ошибке и завершаем работу приложения.

Перед тем как завершить свою работу, приложение закрывает потоки:

try
{
  dis.close();
  dos.close();  
}
catch (IOException ex)
{
  System.out.println(ex.toString());
  System.exit(0);
}

Для завершения работы мы воспользовались методом exit:

System.exit(0);

Назад Вперед

[Назад]