Назад
Вперед
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);
Назад Вперед |