Читайте также: |
|
До сих пор мы читали и записывали байтовые значения, содержащие 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 |