Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Чтение и запись двоичных данных

Читайте также:
  1. Fout<<x<<endl; // записьв файл test
  2. FROM ЗАПИСЬ В
  3. FROM СТУДЕНТ. ЗАПИСЬ
  4. II. 12-24. Причина страданий преданных
  5. II. Ввод и редактирование данных
  6. IX отдел (запись актов гражданского состояния).
  7. V Автоматизированная система обработки данных

 

До сих пор мы читали и записывали байтовые значения, содержащие ASCII-символы. Но возможно также организовать чтение и запись любых типов данных. Предположим, например, что вам надо создать файл, содержащий значение int, double или short. Для чтения и записи простых типов данных также можно использовать классы DataInputStream и DataOutputStream.

Класс DataOutputStream реализует интерфейс DataOutput, в котором определены методы, позволяющие записывать в файл значения любых простых типов. Следует заметить, что данные записываются во внутреннем двоичном формате, а не в виде последовательности символов. Методы, наиболее часто используемые для записи простых типов Java, приведены в таблице 5. Каждый из них генерирует в случае ошибки исключение IOException.

Ниже приведен конструктор класса DataOutputStream. Обратите внимание на то, что при вызове ему передается экземпляр класса OutputStream.

DataOutputStream(OutputStream outputStream)

В данном случае ОutputStream — это поток, в который записываются данные. Для того чтобы организовать запись информации в файл, надо передать конструктору в качестве параметра объект FileOutputStream.

Класс DataInputStreampeam реализует интерфейс DataInput, в котором объявлены методы для чтения всех простых типов Java (таблица 6). Каждый из них может генерировать исключение IOException. В процессе создания объекта DataInputStream используется экземпляр класса, реализующего интерфейс instance, при этом определяются методы для чтения различных типов данных. Следует помнить, что DataInputStream читает данные в двоичном виде в формате, ориентированном на восприятие пользователем. Конструктор DataInputStream имеет следующий вид:

DataInputStream(InputStream inputStream)

где inputStream — это поток, связываемый с создаваемым экземпляром класса InputStream. Для того чтобы организовать чтение информации из файла, надо передать конструктору в качестве параметра объект FileInputStream.

 

Таблица 5. Часто используемые методы вывода данных, определенные в классе DataOutputStream

Метод вывода данных Описание
void writeBoolean(boolean val) Записывает логическое значение, содержащееся в переменной val
void writeByte(int val) Записывает младший из байтов, хранящихся в переменной val
void writeChar(int val) Записывает значение, содержащееся в переменной val, интерпретируя его как символ
void writeDouble(double val) Записывает значение double, содержащееся в переменной val
void writeFloat(float val) Записывает значение float, содержащееся в переменной val
void writeInt(int val) Записывает значение int, содержащееся в переменной val
void writeLong(long val) Записывает значение long, содержащееся в переменной val
void writeShort(int val) Записывает значение, содержащееся з переменной val, интерпретируя его как тип Short

 

Таблица 6. Часто используемые методы ввода данных, определенные в классе DataInputStream

Метод ввода данных Описание
boolean readBoolean() Читает значение типа boolean
byte readByte() Читает значение типа byte
char readChar() Читает значение типа char
double readDouble() Читает значение типа double
float readFloat() Читает значение типа float
int readInt() Читает значение типа int
long readLong() Читает значение типа long
long readShort() Читает значение типа short

 

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

// Запись и чтениедвоичныхданных

import java.io.*;

class RWData

{

public static void main(String args[])

{

DataOutputStream dataOut;

DataInputStream dataIn;

int i = 10;

double d = 1023.56;

boolean b = true;

Try

{

dataOut = new DataOutputStream(new FileOutputStream("testdata"));

}

catch (IOException exc)

{

System. out. println("Cannot open output file.");

return;

}

Try

{

System. out. println("Writing " + i);

// Записьдвоичныхданных

dataOut.writeInt(i);

System. out. println("Writing " + d);

// Записьдвоичныхданных

dataOut.writeDouble(d);

System. out. println("Writing " + b);

// Записьдвоичныхданных

dataOut.writeBoolean(b);

System. out. println("Writing " + 12.2 * 7.4);

// Записьдвоичныхданных

dataOut.writeDouble(12.2 * 7.4);

}

catch (IOException exc)

{

System. out. println("Write error.");

}

Try

{

dataOut.close();

}

catch (IOException exc)

{

System. out. println("Error closing output file.");

return;

}

System. out. println();

// Чтениезаписанныхданных

// Now, read them back.

Try

{

dataIn = new DataInputStream(new FileInputStream("testdata"));

}

catch (IOException exc)

{

System. out. println("Cannot open input file.");

return;

}

Try

{

// Чтениедвоичныхданных

i = dataIn.readInt();

System. out. println("Reading " + i);

// Чтениедвоичныхданных

d = dataIn.readDouble();

System. out. println("Reading " + d);

// Чтениедвоичныхданных

b = dataIn.readBoolean();

System. out. println("Reading " + b);

// Чтениедвоичныхданных

d = dataIn.readDouble();

System. out. println("Reading " + d);

}

catch (IOException exc)

{

System. out. println("Read error.");

}

Try

{

dataIn.close();

}

catch (IOException exc)

{

System. out. println("Error closing input file.");

}

}

}

Вопросы для текущего контроля,

1. Какой тип потока следует использовать для записи двоичных данных?

2. Какой метод надо вызвать для записи значения типа double?

3. Какой метод надо вызвать, чтобы прочитать значение типа short?

Проект CompFiles.java

В рамках данного проекта мы создадим простую, но довольно полезную утилиту, которая будет сравнивать файлы. В процессе работы программы будут открываться два файла, предназначенные для сравнения, а затем данные из них будут читаться и сравниваться между собой. Если на каком-то этапе процедура сравнения даст отрицательный результат, это означает, что содержимое двух файлов не идентично. Если конец обоих файлов будет достигнут одновременно, это означает, что файлы содержат одинаковые данные.

Последовательность действий

1. CoздaйтeфaйлCompFiles.java.

2. Поместите в файл CompFiles.java следующий код:

/* Проект 1. Сравнениедвухфайлов.

Привызоведаннойпрограммынадоуказатьименафайлов.

Команднаястрокаимеетследующийвид:

java CompFile FIRST.TXT SECOND.TXT

*/

import java.io.*;

class CompareFiles {

public static void main(String args[])

{

int i=0, j=0;

FileInputStream f1;

FileInputStream f2;

// В первуюочередьнеобходимоубедиться в том,

// что в команднойстрокеуказаныобафайла

if (args.length!=2) {

System. out. println("Usage: CompFile f1 f2");

return;

}

// Открытиепервогофайла

try {

f1 = new FileInputStream(args[0]);

} catch (FileNotFoundException exc) {

System. out. println(args[0] + " File Not Found");

return;

}

// Открытиевторогофайла

try {

f2 = new FileInputStream(args[1]);

} catch (FileNotFoundException exc) {

System. out. println(args[1] + " File Not Found");

// Есливторойфайлоткрытьневозможно, первый

// файлнадозакрыть

try {

f1.close();

} catch (IOException exc2) {

System. out. println("Cannot close " + args[0]);

}

return;

}

// Сравнениефайлов

try {

do {

i = f1.read();

j = f2.read();

if (i!= j) break;

} while (i!= -1 && j!= -1);

if (i!= j)

System. out. println("Files differ.");

Else

System. out. println("Files are the same.");

} catch (IOException exc) {

System. out. println("File Error");

}

try {

f1.close();

} catch (IOException exc) {

System. out. println("Error closing " + args[0]);

}

try {

f2.close();

} catch (IOException exc) {

System. out. println("Error closing " + args[1]);

}

}

}

3. Для того чтобы проверить, как работает программа, сначала скопируйте файл CompFiles.java в файл temp. Затем введите командную строку

java CompFiles CompFiles.java temp

Программа сообщит вам, что файлы идентичны. Затем сравните CompFiles.java с файлом CopyFile.java (который был рассмотрен ранее). Необходимая для этого командная строка имеет следующий вид:

java CompFiles CompFiles.java CopyFile.java

Файлы содержат различные данные, о чем и сообщит программа CompFiles.

4. Попробуйте самостоятельно снабдить программу CompFiles некоторыми дополнительными возможностями. Например, добавьте опцию, которая позволит производить сравнение без учета регистра символов. Можно также доработать CompFiles, чтобы она выводила позицию, в которой найдено первое различие между двумя файлами.

 


Файлы произвольного доступа

 

До сих пор мы имели дело с последовательными файлами, содержимое которых записывалось и извлекалось байт за байтом. Однако Java позволяет также непосредственно обращаться к любым данным в файле. Для решения данной задачи предусмотрен класс RandomAccessFile, инкапсулирующий файл с произвольным доступом. Класс RandomAccessFile не является подклассом InputStream или OutputStream. Вместо этого он реализует интерфейсы DataInput и DataOutput, в которых объявлены основные методы ввода-вывода. В нем также содержатся средства позиционирования, позволяющие устанавливать текущую позицию в файле произвольным образом. Конструктор класса, который мы будем использовать, выглядит следующим образом:


Дата добавления: 2015-07-10; просмотров: 360 | Нарушение авторских прав


Читайте в этой же книге: Байтовые и символьные потоки | Классы символьных потоков | Использование байтовых потоков | Чтение символов | Использование оболочек для преобразования строк, представляющих числа |
<== предыдущая страница | следующая страница ==>
FileInputStream(String fileName) throws FileNotFoundException| Void seek(long newPos) throws IOException

mybiblioteka.su - 2015-2024 год. (0.019 сек.)