Содержание
· 1 СИСТЕМА ВВОДА/ВЫВОДА JAVA
o 1.1 Класс File
§ 1.1.1 Список каталогов
§ 1.1.2 Безымянные внутренние классы
§ 1.1.3 Проверка существования и создание каталогов
o 1.2 Ввод и вывод
§ 1.2.1 Типы InputStream
§ 1.2.2 Типы OutputStream
o 1.3 Добавление атрибутов и интерфейсов
o 1.4 Чтение из InputStream с использованием FilterInputStream
o 1.5 Запись в OutputStream с помощью FilterOutputStream
o 1.6 Классы Reader и Writer
o 1.7 Источники и приемники данных
o 1.8 Изменение поведения потока
o 1.9 Классы, оставленные без изменений
o 1.10 RandomAccessFile: сам по себе
o 1.11 Типичное использование потоков ввода/вывода
§ 1.11.1 Буферизованное чтение из файла
§ 1.11.2 Чтение из памяти
§ 1.11.3 Форматированное чтение из памяти
§ 1.11.4 Вывод в файл
§ 1.11.5 Сокращенная форма вывода текстового файла
§ 1.11.6 Сохранение и восстановление данных
§ 1.11.7 Чтение/запись файлов с произвольным доступом
§ 1.11.8 Каналы
o 1.12 Средства чтения и записи файлов
o 1.13 Стандартный ввод/вывод
§ 1.13.1 Чтение из стандартного потока ввода
§ 1.13.2 Замена System.out на PrintWriter
§ 1.13.3 Перенаправление стандартного ввода/вывода
o 1.14 Новый ввод/вывод (nio)
§ 1.14.1 Преобразование данных
§ 1.14.2 Извлечение примитивов
§ 1.14.3 Представления буферов
§ 1.14.4 О порядке байтов
§ 1.14.5 Буферы и операции с данными
§ 1.14.6 Подробно о буфере
§ 1.14.7 Отображаемые в память файлы
§ 1.14.8 Производительность
§ 1.14.9 Блокировка файлов
§ 1.14.10 Блокирование части отображаемого файла
o 1.15 Сжатие данных
§ 1.15.1 Простое сжатие в формате GZIP
§ 1.15.2 Многофайловые архивы ZIP
§ 1.15.3 Архивы Java ARchives (файлы JAR)
o 1.16 Сериализация объектов
§ 1.16.1 Обнаружение класса
§ 1.16.2 Управление сериализацией
§ 1.16.3 Ключевое слово transient
§ 1.16.4 Альтернатива для Externalizable
§ 1.16.5 Долговременное хранение
o 1.17 Резюме
Создание хорошей системы ввода/вывода является одной из труднейших задач разработчика языка. Доказательством этого утверждения служит множество подходов, используемых при разработке систем ввода/вывода. Основная сложность состоит в том, что необходимо учесть все возможные ситуации. Это не только наличие множества источников и приемников данных, с которыми необходимо поддерживать связь (файлы, консоль, сетевые соединения), но и реализации различных форм этой связи (последовательный доступ, произвольный, буферизованный, двоичный, символьный, построчный, пословный и т. д.).
Разработчики библиотеки Java решили начать с создания огромного количества классов. Вообще говоря, в библиотеке ввода/вывода Java так много классов, что потеряться в них проще простого (парадоксально, но сама система ввода/вывода Java в действительности не нуждается в таком количестве классов). Потом, после выхода первой версии языка Java, в библиотеке ввода/вывода последовали значительные изменения: к ориентированным на посылку и прием байтов классам добавились основанные на Юникод классы, работающие с символами. В JDK-1.4 классы nіо (от сочетания «new I/O», «новый ввод/вывод») призваны улучшить производительность и функциональность.
В результате, чтобы понять общую картину ввода/вывода в Java и начать использовать ее, вам придется изучить порядочный ворох классов. Вдобавок не менее важно понять и изучить эволюцию библиотеки ввода/вывода, несмотря на вашу очевидную реакцию: «Избавьте меня от истории! Просто покажите, как работать с библиотекой!» Если не уяснить причины изменений, проведенных в библиотеке ввода/вывода, вскоре мы запутаемся в ней и не сможем твердо аргументировать сделанный нами выбор в пользу того или иного класса. В этой главе мы познакомимся с различными классами, отвечающими за ввод/вывод в библиотеке Java, а также научимся использовать их.
Класс File
Перед тем как перейти к классам, которые осуществляют реальные запись и чтение данных, мы рассмотрим вспомогательные инструменты библиотеки, предназначенные для работы с файлами и каталогами. Имя класса File весьма обманчиво: легко подумать, что оно всегда ссылается на файл, но это не так. Класс File может представлять как имя определенного файла, так, имена группы файлов, находящихся в каталоге. Если класс представляет каталог, его метод list() возвращает массив строк с именами всех файлов. Использовать в данной ситуации массив (а не более гибкий контейнер) очень удобно: количество файлов в каталоге фиксировано, как и размер массива, а если понадобится узнать имена файлов в другом каталоге, достаточно создать еще один объект File. Следующий раздел покажет, как использовать этот класс в совокупности с тесно связанным с ним интерфейсом FilenameFilter.