Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

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

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

Ниже показан такой класс Text File с набором статических методов, построчно считывающих и записывающих текстовые файлы. Вдобавок можно создать экземпляр класса Text File, который будет хранить содержимое файла в списке ArrayList (и функциональность списка ArrayList станет доступной при работе, с содержимым файла):

//• net/mi ndvi ew/uti1/TextFi1e java

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

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

package net mindview util;

import java io.*.

import java util *.

public class TextFile extends ArrayList<String> { // Чтение файла как одной строки; public static String read(String fileName) {

StringBuilder sb = new StringBuilderO; try {

BufferedReader in= new BufferedReader(new FileReader(

продолжение &

new Fi1е(fi 1eName).getAbsoluteFi1e));

try {

String s,

while((s = in readLineO) != null) { sb append(s); sb.append("\n");

}

} finally {

in.closeO;

}

} catch(IOException e) {

throw new RuntimeException(e);

}

return sb toStringO;

}

// Запись файла за один вызов метода: public static void write(String fileName, String text) { try {

PrintWriter out = new PrintWriter(

new FileCfileName).getAbsoluteFileO);

try {

out.print(text); } finally {

out. closeO;

}

} catch(IOException e) {

throw new RuntimeException(e);

}

}

// Чтение файла с разбиением по регулярному выражению: public TextFi1e(String fileName. String splitter) {

super(Arrays.asLi st(readCfi1eName).splitCsplitter))); // Вызов splitO часто оставляет пустой объект // String в начальной позиции: if(get(0) equalsC")) remove(O);

}

// Обычное построчное чтение: public TextFi1e(String fileName) { this(fileName, "\n");

}

public void writeCString fileName) { try {

PrintWriter out = new PrintWriterC

new FileCfil eName). getAbsol uteFi 1 eO);

try {

forCString item : this)

out.println(item);

} finally {

out.closeO;

}

} catch(IOException e) {

throw new RuntimeException(e);

}

}

// Простая проверка :

public static void main(String[] args) {

String file = read("TextFile.java"); writeCtest.txt", file);

TextFile text = new TextFileCtest.txt"); text.wri te("test2.txt");

// Разбиение на уникальный отсортированный список слов: TreeSet<String> words = new TreeSet<String>(

new TextFileC"TextFile.java". "WW+")); // Вывод слов, начинающихся с прописной буквы-System.out.pri ntln(words.headSet("a"));

}

} /* 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]

*///:-

Метод 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). Значение стандартного ввода/вывода состоит в том, что программы легко соединять в цепочку, где стандартный вывод одной программы становится стандартным вводом другой программы. Это мощный инструмент.

Поделиться:
Популярные книги

Второгодка. Книга 2. Око за око

Ромов Дмитрий
2. Второгодка
Фантастика:
героическая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Второгодка. Книга 2. Око за око

Локки 6. Потомок бога

Решетов Евгений Валерьевич
6. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 6. Потомок бога

Древесный маг Орловского княжества 2

Павлов Игорь Васильевич
2. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 2

Точка Бифуркации VI

Смит Дейлор
6. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации VI

Индульгенция 2. Без права на жизнь

Машуков Тимур
2. Темный сказ
Фантастика:
аниме
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Индульгенция 2. Без права на жизнь

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

Моров. Том 1 и Том 2

Кощеев Владимир
1. Моров
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Моров. Том 1 и Том 2

Князь

Шмаков Алексей Семенович
5. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
5.00
рейтинг книги
Князь

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Адепт

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Гримуар темного лорда IX

Грехов Тимофей
9. Гримуар темного лорда
Фантастика:
попаданцы
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда IX