Главная страница

Ответы на вопросы по ревью 4. Java io. Ключевым понятием здесь является понятие потока


Скачать 1.93 Mb.
НазваниеJava io. Ключевым понятием здесь является понятие потока
Дата03.07.2022
Размер1.93 Mb.
Формат файлаdoc
Имя файлаОтветы на вопросы по ревью 4.doc
ТипДокументы
#623608
страница11 из 39
1   ...   7   8   9   10   11   12   13   14   ...   39

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


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

RandomAccessFile(String имя_файла, String доступ)

throws FileNotFoundException

Здесь конкретный файл указывается с помощью параметра имя_файла, а параметр доступ определяет, какой именно тип доступа будет использоваться для обращения к файлу. Если параметр доступ принимает значение "г", то данные могут читаться из файла, но не записываться в него. Если же указан тип доступа "rw", то файл открывается как для чтения, так и для записи.

Метод seek(), общая форма объявления которого приведена ниже, служит для установки текущего положения указателя файла,

void seek(long newPos) throws IOException

Здесь параметр newPos определяет новое положение указателя файла в байтах относительно начала файла. Операция чтения или записи, следующая после вызова метода seek(), будет выполняться относительно нового положения указателя файла.

В классе RandomAccessFile определены методы read() и write(). Этот класс также реализует интерфейсы Datalnput и DataOuput, т.е. в нем доступны методы чтения и записи простых типов, например readlnt() и writeDouble().

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

// Демонстрация произвольного доступа к файлам.

// Для компиляции этого кода требуется JDK 7

// или более поздняя версия данного комплекта.

import java.io.*;

class RandomAccessDemo {

public static void main(String args[])

{

double data[] = { 19.4, 10.1, 123.54, 33.0, 87.9, 74.25 };

double d;
// открыть и использовать файл с произвольным доступом

// Файл с произвольным доступом открывается для записи и чтения.

try (RandomAccessFile raf = new RandomAccessFile("random.dat", "rw"))

{

// записать значения в Файл

for(int i=0; i < data.length; i++) {

raf.writeDouble(data[i]);

}
//а теперь прочитать отдельные значения из файла

// Для установки указателя файла служит метод seek().

raf.seek(0); // найти первое значение типа double

d = raf.readDouble();

System.out.println("First value is " + d) ;
raf.seek(8); // найти второе значение типа double

d = raf.readDouble();

System.out.println("Second value is " + d) ;
raf.seek(8 * 3); // найти четвертое значение типа double

d = raf.readDouble();

System.out.println("Fourth value is " + d);
System.out.println();
// а теперь прочитать значения через одно

System.out.println("Here is every other value: ");

for(int i=0; i < data.length; i+=2) {

raf.seek(8 * i); // найти i-e значение типа double

d = raf.readDouble();

System.out.print(d + " ") ;

}

}

catch(IOException exc) {

System.out.println("I/O Error: " + exc) ;

}

}

}

Результат выполнения данной программы выглядит следующим образом:

First value is 19.4

Second value is 10.1

Fourth value is 33.0
Here is every other value:

19.4 123.54 87.9

Обратите внимание на расположение каждого числового значения. Ведь значение типа double занимает 8 байтов, и поэтому каждое последующее число начинается на 8-байтовой границе предыдущего числа. Иными словами, первое числовое значение начинается на позиции нулевого байта, второе — на позиции 8-го байта, третье — на позиции 16-го байта и т.д. Поэтому для чтения четвертого числового значения нужно установить указатель файла на позиции 24-го байта при вызове метода seek().

1   ...   7   8   9   10   11   12   13   14   ...   39


написать администратору сайта