русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Чтение/запись файлов с произвольным доступом


Дата добавления: 2015-06-12; просмотров: 1666; Нарушение авторских прав


Как уже было замечено, работа с классом RandomAccessFile напоминает использование совмещенных в одном классе потоков DataInputStream и DataOutputStream (они реализуют те же интерфейсы DataInput и DataOutput). Кроме того, метод seek() позволяет переместиться к определенной позиции и изменить хранящееся там значение.

При использовании RandomAccessFile необходимо знать структуру файла, чтобы правильно работать с ним. Класс RandomAccessFile содержит методы для чтения и записи примитивов и строк UTF-8. Пример:

//: io/UsingRandomAccessFile.java

import java.io.*;

 

public class UsingRandomAccessFile {

static String file = "rtest.dat";

static void display() throws IOException {

RandomAccessFile rf = new RandomAccessFile(file, "r");

for(int i = 0; i < 7; i++)

System.out.println(

"Value " + i + ": " + rf.readDouble());

System.out.println(rf.readUTF());

rf.close();

}

public static void main(String[] args)

throws IOException {

RandomAccessFile rf = new RandomAccessFile(file, "rw");

for(int i = 0; i < 7; i++)

rf.writeDouble(i*1.414);

rf.writeUTF("The end of the file");

rf.close();

display();

rf = new RandomAccessFile(file, "rw");

rf.seek(5*8);

rf.writeDouble(47.0001);

rf.close();

display();

}

}

<spoiler text="Output:">

Value 0: 0.0

Value 1: 1.414

Value 2: 2.828

Value 3: 4.242

Value 4: 5.656

Value 5: 7.069999999999999

Value 6: 8.484

The end of the file

Value 0: 0.0

Value 1: 1.414

Value 2: 2.828

Value 3: 4.242

Value 4: 5.656

Value 5: 47.0001

Value 6: 8.484

The end of the file

</spoiler> Метод display() открывает файл и выводит семь значений в формате double. Метод main() создает файл, открывает и модифицирует его. Поскольку значение double всегда занимает 8 байт, для перехода к пятому числу методу seek() следует передать смещение5*8. Как упоминалось ранее, класс RandomAccessFile отделен от остальных классов иерархии ввода/вывода, если не считать того факта, что он реализует интерфейсы DataInput и DataOutput. Приходится предполагать, что для этого RandomAccessFile правильно организована буферизация, потому что включить ее в программе не удастся. Некоторая свобода выбора предоставляется только со вторым аргументом конструктора: RandomAccessFile может открываться в режиме чтения ("r") или чтения/записи ("rw"). Также стоит рассмотреть возможность употребления вместо класса RandomAccessFile механизма отображаемых в память файлов.



Каналы

В этой главе были коротко упомянуты классы каналов PipedInputStream, PipedOutputStream, PipedReader и PipedWriter. Это не значит, что они редко используются или не слишком полезны, просто их смысл и действие нельзя донести до по­нимания до тех пор, пока не объяснена многозадачность: каналы предназначены для связи между отдельными потоками программы. Они будут описаны позднее.

 

Средства чтения и записи файлов

Очень часто в программировании производится такая цепочка действий: файл считывается в память, там он изменяется, а потом снова записывается на диск. Одна из проблем при работе с библиотекой ввода/вывода Java состоит в том, что для выполнения таких достаточно типичных операций вам придется написать некоторое количество кода — не существует вспомогательных функций, на которые можно переложить такую деятельность. Что еще хуже, с надстройками вообще трудно запомнить, как открываются файлы. Поэтому имеет смысл добавить в вашу библиотеку вспомогательные классы, которые легко сделают нужное за вас. В Java SE5 у PrintWriter появился вспомогательный конструктор, позволяющий легко открыть текстовый файл для чтения. Тем не менее существует много других типичных задач, часто выполняемых в повседневной работе, и было бы разумно избавиться от лишнего кода, связанного с их выполнением. Ниже показан такой класс TextFile с набором статических методов, построчно считывающих и записывающих текстовые файлы. Вдобавок можно создать экземпляр класса TextFile, который будет хранить содержимое файла в списке ArrayList (и функциональность списка ArrayList станет доступной при работе, с содержимым файла):

//: net/mindview/util/TextFile.java

// Статические функции для построчного считывания и записи

// текстовых файлов,- а также манипуляции файлом как списком ArrayList

package net.mindview.util;

import java.io.*;

import java.util.*;

 

public class TextFile extends ArrayList<String> {

// Read a file as a single string:

public static String read(String fileName) {

StringBuilder sb = new StringBuilder();

try {

BufferedReader in= new BufferedReader(new FileReader(

new File(fileName).getAbsoluteFile()));

try {

String s;

while((s = in.readLine()) != null) {

sb.append(s);

sb.append("\n");

}

} finally {

in.close();

}

} catch(IOException e) {

throw new RuntimeException(e);

}

return sb.toString();

}

// Write a single file in one method call:

public static void write(String fileName, String text) {

try {

PrintWriter out = new PrintWriter(

new File(fileName).getAbsoluteFile());

try {

out.print(text);

} finally {

out.close();

}

} catch(IOException e) {

throw new RuntimeException(e);

}

}

// Read a file, split by any regular expression:

public TextFile(String fileName, String splitter) {

super(Arrays.asList(read(fileName).split(splitter)));

// Regular expression split() often leaves an empty

// String at the first position:

if(get(0).equals("")) remove(0);

}

// Normally read by lines:

public TextFile(String fileName) {

this(fileName, "\n");

}

public void write(String fileName) {

try {

PrintWriter out = new PrintWriter(

new File(fileName).getAbsoluteFile());

try {

for(String item : this)

out.println(item);

} finally {

out.close();

}

} catch(IOException e) {

throw new RuntimeException(e);

}

}

// Simple test:

public static void main(String[] args) {

String file = read("TextFile.java");

write("test.txt", file);

TextFile text = new TextFile("test.txt");

text.write("test2.txt");

// Break into unique sorted list of words:

TreeSet<String> words = new TreeSet<String>(

new TextFile("TextFile.java", "\\W+"));

// Display the capitalized words:

System.out.println(words.headSet("a"));

}

}

<spoiler text="Output:">

[0, ArrayList, Arrays, Break, BufferedReader, BufferedWriter, Clean,

Display, File, FileReader, FileWriter, IOException, Normally, Output,

PrintWriter, Read, Regular, RuntimeException, Simple, Static, String,

StringBuilder, System, TextFile, Tools, TreeSet, W, Write]

</spoiler> Метод read() присоединяет каждую строку к StringBuilder, а за ней присоединяется перевод строки, удаленный при чтении. Затем возвращается объект String, содержащий весь файл. Метод write() открывает файл и записывает в него текст. Обратите внимание: к каждой операции открытия файла добавляется парный вызов close() в секции finally. Тем самым обеспечивается гарантированное закрытие файла после завершения работы. Конструктор использует метод read() для превращения файла в String, после чего он вызывает метод String.split(), чтобы разбить результат на строки. В качестве разделителя используются символы новой строки (если вы будете часто использовать этот класс, то, возможно, захотите переписать этот конструктор, чтобы он работал эффективнее). К сожалению, аналогичного метода для соединения строк нет, так что для записи строк придется обойтись нестатическим методом write(). Так как класс должен упростить процесс чтения и записи файлов, все исключения IOException преобразуются в RuntimeException, чтобы пользователю не пришлось создавать блоки try/catch. Возможно, вы предпочтете создать другую версию, которая возвращает IOException вызывающей стороне.

В методе main() выполняется небольшой тест, позволяющий удостовериться в правильной работе методов. Несмотря на то что кода в этом классе немного, его применение позволит сэкономить вам уйму времени и сделать вашу жизнь проще, в чем вы еще будете иметь возможность убедиться чуть позже.

Стандартный ввод/вывод

Термин «стандартный ввод/вывод» возник еще в эпоху UNIX (и в некоторой форме имеется и в Windows, и во многих других операционных системах). Он означает единственный поток информации, используемый программой. Вся информация программы приходит из стандартного ввода (standard input), все данные записываются в стандартный вывод (standard output), а все ошибки программы передаются в стандартный поток для ошибок (standard error). Значение стандартного ввода/вывода состоит в том, что программы легко соединять в цепочку, где стандартный вывод одной программы становится стандартным вводом другой программы. Это мощный инструмент.

 



<== предыдущая лекция | следующая лекция ==>
Сохранение и восстановление данных | Чтение из стандартного потока ввода


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.645 сек.