1 Java 9. ПОТОКИ ВВОДА/ВЫВОДА. 2 Класс File Класс File может представлять как имя определенного файла, так, имена группы файлов, находящихся в каталоге.

Презентация:



Advertisements
Похожие презентации
Глава 9. ВВОД-ВЫВОД ДАННЫХ И ФАЙЛОВАЯ СТРУКТУРА Логический и физический файлы Типы файловой переменной Общие процедуры работы с файлами Текстовые файлы.
Advertisements

Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 4 Трансформация логической модели в программный код Лекции читает кандидат технических.
Saint Petersburg, 2012 Java Lecture #04 Part I - IO.
ЛАБОРАТОРНАЯ РАБОТА 1 ПРОЕКТИРОВАНИЕ И РЕАЛИЗАЦИЯ ТАБЛИЦ, ИСПОЛЬЗУЕМЫХ В ТРАНСЛЯТОРЕ Рейн Т. С.
Сериализация и RMI Java Advanced. 2Georgiy KorneevJava Advanced / Сериализация и RMI Содержание Сериализация Концепции RMI Применение RMI Заключение.
Click to edit Master title style IDK1011 Основы программирования Диалоговые окна Чтение файлов и директорий.
Java in pictures. Part 3.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Потоки (файлы) Функции и типы для работы с потоками в стиле С описаны в модуле stdio.h. В отличие от Паскаля в С с потоком не связан тип данных. Поток.
Кафедра ОСУ, Java 2004 Слайд 1 Наследование Наследование позволяет использовать существующий класс для определения новых классов, т.е. способствует.
Потоки Язык C++ не обеспечивает средств для ввода/вывода Ему это и не нужно; такие средства легко и элегантно можно создать с помощью самого языка Традиционно.
Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
Программирование типовых алгоритмов вычислений Информатика.
Файловая переменная. Файл – совокупность данных, записанная во внешней памяти под определенным именем. Любой файл имеет три характерные особенности: уникальное.
Транксрипт:

1 Java 9. ПОТОКИ ВВОДА/ВЫВОДА

2 Класс File Класс File может представлять как имя определенного файла, так, имена группы файлов, находящихся в каталоге. Этот класс не содержит методы для работы с содержимым файла Но позволяет манипулировать такими свойствами файла, как права доступа, дата и время создания, путь в иерархии каталогов, создание, удаление файла, изменение его имени и каталога и т.д. При создании объекта класса File компилятор не выполняет проверку на существование физического файла с заданным путем.

3 Разделители пути Существует разница между разделителями, употребляющимися при записи пути к файлу: для системы Unix – / для Windows – \\ В классе File предусмотрены специальные поля : public static final String separator; public static final char separatorChar; public static final String pathSeparator; public static final char pathSeparatorChar; example01 : работа с файловой системой: FileTest.java File myFile = new File(File.separator + com + File.separator + myfile.txt ); The system-dependent default name-separator character The system-dependent path-separator character

4 Паттерн Strategy (Стратегия) Context +contextAlgorithm() -Strategy strategy Клиент > Strategy +algorithm() Strategy1 +algorithm() Strategy2 +algorithm() Strategy3 Инкапсуляция поведения р е а л и з у е т с о д е р ж и т public void contextAlgorithm(){ strategy.algorithm(); }

5 Интерфейс FilenameFilter eck01 : DirList.java public interface FilenameFilter { boolean accept(File dir, String name); } метод accept() вызывается методом list() с целью определения того, какие имена файлов должны включаться в выходной список. Это пример паттерна «стратегия»: list() реализует базовую функциональность FilenameFilter предоставляет алгоритм, необходимый для работы list().

6 Поток (stream) Произвольный источник или приемник данных, который способен производить или получать некоторую информацию. Поток скрывает детали низкоуровневых процессов, происходящих с данными непосредственно в устройствах ввода/вывода.

7 Сложность системы ввода/вывода Наличие множества источников и приемников данных, с которыми необходимо поддерживать связь: файлы консоль сетевые соединения Необходимость реализации различных форм доступа: последовательный произвольный буферизованный двоичный символьный построчный пословный и т. д. Необходимость построения потока на основе нескольких объектов – главная причина трудностей в освоении библиотеки ввода/вывода Java.

8 Основные базовые классы java.io InputStream abstract class is the superclass of all classes representing an input stream of bytes FilterInputStream extends InputStream contains some other input stream, which it uses as its basic source of data, possibly transforming the data along the way or providing additional functionality Reader abstract class for reading character streams FilterReader extends Reader abstract class for reading filtered character streams OutputStream abstract class is the superclass of all classes representing an output stream of bytes FilterOutputStream extends OutputStream the superclass of all classes that filter output streams Writer abstract class for writing to character streams FilterWriter extends Writer abstract class for writing filtered character streams Ввод Вывод

9 Ввод/вывод в языке Java Типичный набор объектов, использующих декораторы для расширения функциональности чтения данных из файла: BufferedInputStream и LineNumberlnputStream расширяют FilterInputStream - класс декоратора. Конкретный декоратор LineNumberlnputStream добавляет возможность подсчета строк в процессе чтения данных. Конкретный декоратор BufferedlnputStream буферизует ввод для повышения производительности и дополняет интерфейс новым методом readLine() для построчного чтения символьных данных Текстовый файл FilelnputStream декорируемый компонент, библиотека ввода/вывода Java предоставляет базовые компоненты FilelnputStream, StringBufferlnputStream, ByteArrayInputStream, предназначенные для чтения байтов данных.

10 Декорирование классов java.io Абстрактный компонент Абстрактный декоратор Конкретные декораторы Конкретные компоненты InputStream FileInputStream PushbackInputStreamDataInputStream BufferedInputStream StringBuferedInputStream ByteArrayInputStream FilterInputStream LineNumberInputStream Выходные потоки используют аналогичную архитектуру. Потоки Reader/Writer (для символьных данных) достаточно близко отражают архитектуру потоковых классов. ex01: собственная реализация декоратора ввода/вывода

11 Типы InputStream Назначение базового класса InputStream – представлять классы, которые получают данные из различных источников. Такими источниками могут быть: массив байтов; строка (String); файл; «канал» (pipe): данные помещаются с одного «конца» и извлекаются с другого; последовательность различных потоков, которые можно объединить в одном потоке; другие источники (например, подключение к Интернету). С каждым из источников связывается некоторый подкласс базового класса InputStream. Существует класс FilterlnputStream, призводный от класса InputStream, который представляет собой основу для классов-«надстроек», наделяющих входные потоки полезными свойствами и интерфейсами. Иерархия классов IO-InputStream.bmp

12 Типы OutputStream В данную категорию попадают классы, определяющие, куда направляются ваши данные: массив байтов (но не напрямую в String; предполагается, что вы сможете создать их из массива байтов), файл, «канал» (pipe - предназначены для связи между отдельными потоками программы) Класс FilterOutputStream, производный от OutputStream, предоставляет базовый класс для классов-«надстроек», которые способны наделять существующие потоки новыми полезными атрибутами и интерфейсами. Иерархия классов IO-OutputStream.bmp

13 Чтение из InputStream с использованием FilterlnputStream Классы, производные от FilterlnputStream, выполняют две различные миссии. DatalnputStream позволяет читать из потока различные типы простейших данных и строки. Все методы этого класса начинаются с префикса read – например, readByte(), readFloat() и т. п. Другие классы изменяют внутренние механизмы входного потока: применение буферизации ( BufferedlnputStream ), подсчет количества прочитанных строк ( LineNumberlnputStream ). Ввод данных почти всегда осуществляется с буферизацией, вне зависимости от присоединенного устройства ввода/вывода example02 : побайтное чтение/запись InputDemo.java OutputDemo.java

14 Классы Reader и Writer Это базовые классы для символьно ориентированного ввода/вывода в кодировке Юникод (Java 1.1) Достоинства: интернационализация скорость Существуют классы-адаптеры: InputStreamReader конвертирует InputStream в Reader, OutputStreamWriter трансформирует OutputStream в Writer. example03 : ввод/вывод символьные потоки DemoWriter.java DemoReader.java

15 Классы DatalnputStream/DataOutputStream Класс DataOutputStream, позволяет форматировать и записывать в поток примитивы и строки таким образом, что на любой машине и на любой платформе их сможет прочитать и правильно обработать DataInputStream.

16 Источники и приемники данных Практически у всех изначальных потоковых классов имеются соответствующие классы Reader и Writer со схожими функциями. Но во многих ситуациях правильным (а зачастую и единственным) выбором становятся классы, ориентированные на прием и посылку байтов. в особенности это относится к библиотекам сжатия данных java.util.zip. Поэтому лучше всего будет такая тактика: пытаться использовать классы Reader и Writer где только возможно; где эти классы неприменимы компилятор выдаст сообщение об ошибке. Класс DataOutputStream, используется для пересылки данных независимым от платформы и машины способом, поэтому для передачи данных между компьютерами по-прежнему остаются актуальными иерархии InputStream и OutputStream example04 : сохранение и восстановление данных StoringAndRecoveringDate.java

17 RandomAccessFile Класс RandomAccessFile напрямую наследует от корневого класса Object. Предназначен для работы с файлами, содержащими записи известного размера, между которыми можно перемещаться методом seek(), а также выполнять операции чтения и модификации. Записи не обязаны иметь фиксированную длину. Конструктор этого класса требует второй аргумент ( «r» или «rw» ). Прямое позиционирование допустимо только для класса RandomAccessFile, и работает оно только в случае файлов. Большая часть (если не вся) функциональности класса RandomAccessFile в JDK 1.4 также реализуется отображаемыми в память файлами (memory-mapped files) из нового пакета nio. example05 : запись и чтение из потока RandomFiles.java

18 Стандартные потоки public static поля класса System пакета java.lang : in - ссылка на объект класса InputStream, стандартный поток ввода, out - ссылка на объект класса PrintStream, стандартный поток вывода err - ссылка на объект класса PrintStream, стандартный поток вывода ошибок. Эти потоки связаны с консолью, но могут быть переназначены на другое устройство.

19 Перенаправление стандартного ввода/вывода методы класса System: setln(InputStream) setOut(PrintStream) setErr(PrintStream) Перенаправление стандартного вывода полезно, когда программа выдает слишком много сообщений сразу, удобно для программ, работающих с командной строкой, в которых необходимо поддержать некоторую последовательность введенных пользователем данных, и др. example06 : Redirecting.java

20 Новый ввод/вывод (nio) При создании библиотеки «нового ввода/вывода» Java, появившейся в JDK 1.4 в пакетах java.nio.*, ставилась единственная цель: скорость. «Старые» пакеты ввода/вывода были переписаны с учетом достижений nio. Увеличения скорости удалось достичь с помощью структур, близких к средствам самой операционной системы: каналов1 ( channels ) и буферов ( buffers ). Три класса из «старой» библиотеки ввода/вывода были изменены так, чтобы они позволяли получить канал FileChannel : это FilelnputStream, FileOutputStream и RandomAccessFile. Классы для символьных данных Reader и Writer не образуют каналов, однако вспомогательный класс java.nio.channels.Channels имеет набор методов, позволяющих получить объекты Reader и Writer для каналов.

21 Отображаемые в память файлы Механизм отображения файлов в память позволяет создавать и изменять файлы, размер которых слишком велик для прямого размещения в памяти. В таком случае вы считаете, что файл целиком находится в памяти, и работаете с ним как с очень большим массивом.

22 Блокировка файлов Блокировка файлов позволяет синхронизировать доступ к файлу как к совместно используемому ресурсу. Потоки, претендующие на один и тот же файл, могут принадлежать различным виртуальным машинам JVM, или один поток может быть Java-потоком, а другой представлять собой обычный поток операционной системы. Блокированные файлы видны другим процессам операционной системы, поскольку механизм блокировки Java напрямую связан со средствами операционной системы.

23 Сжатие данных Библиотека ввода/вывода Java содержит классы, поддерживающие ввод/вывод в сжатом формате (java.util.zip и java.util.jar). Эти классы не являются частью иерархии символьно- ориентированных потоков Reader и Writer, они надстроены над байт-ориентированными классами InputStream и OutputStream, так как библиотека сжатия работает не с символами, а с байтами. Пакет java.util.jar позволяет считывать, создавать и изменять файлы форматов jar, а также вычислять контрольные суммы входящих потоков данных. example07 : создание jar-архива PackJar.java чтение jar-архива UnPackJar.java

24 Сериализация объектов Сериализация (serialization) объектов Java позволяет вам взять любой объект, реализующий интерфейс Serializable, и превратить его в последовательность байтов, из которой затем можно полностью восстановить исходный объект. Сказанное справедливо и для сетевых соединений. С ее помощью можно осуществить легковесное долговременное хранение (lightweight persistence)

25 Назначение сериализации Механизм сериализации объектов был добавлен в язык для поддержки двух расширенных возможностей: Удаленный вызов методов Java (RMI) позволяет работать с объектами, находящимися на других компьютерах, точно так же, как и с теми, что существуют на вашей машине. Использование сериализации объектов визуальными компонентами Java-Bean. Информация о состоянии визуальных компонентов обычно изменяется во время разработки. Эту информацию о состоянии необходимо сохранить, а затем, при запуске программы, восстановить.

26 Процедура сериализации/десериализации 1) Класс реализует интерфейс Serializable (без методов) 2) Создается объект выходного потока OutputStream и помещается в конструктор класса ObjectOutputStream 3) У объекта ObjectOutputStream вызывается метод writeObject() в качестве параметра в метод передается объект для сериализации Сохраняется не только сам образ объекта, но и все связанные с ним объекты, все объекты в связанных объектах, и т. д. 1) Класс реализует интерфейс Serializable (без методов) 2) Создается объект входного потока InputStream и помещается в конструктор класса ObjectInputStream 3) У объекта ObjectInputStream вызывается метод readObject() который должен вернуть объект из потока Десериализация происходит следующим образом: под объект выделяется память его поля заполняются значениями из потока. Конструктор объекта при этом не вызывается Сериализация Десериализация

27 Спецификаторы Спецификаторы transient и static означают, что поля, помеченные ими, не могут быть предметом сериализации, поле со спецификатором transient после десериализации получает значение по умолчанию, соответствующее его типу (объектный тип всегда инициализируется по умолчанию значением null ) поле со спецификатором static получает значение по умолчанию в случае отсутствия в области видимости объектов своего типа, а при их наличии получает значение, которое определено для существующего объекта. example08 : запись сериализованного объекта в файл и его десериализация DemoSerialization.java

28 serialVersionUID При сериализации объекта класса, реализующего интерфейс Serializable, учитывается порядок объявления полей в классе. Поле private static final long serialVersionUID содержит уникальный идентификатор версии класса сериализованного объекта. Это поле записывается в поток при сериализации объекта класса. Поэтому при изменении значения этого поля десериализация пройдет некорректно. Если этого поля нет, то соотв. число (при сериализации/десериализации) рассчитывается автоматически на основании имеющихся полей класса и их порядка объявления.

29 НЕсериализуемый родительский класс При десериализации вызывается конструктор без параметров родительского НЕсериализуемого класса. Если такого конструктора нет – при десериализации возникнет ошибка. Конструктор же дочернего объекта, того, который мы десериализуем, не вызывается. example08: десериализация с несериализуемым родительским классом InterestingTestSerialization.java class Parent { int fieldParent; public Parent() { fieldParent = 10; } class Child extends Parent implements Serializable { int fieldChild; public Child() { fieldParent = 20; fieldChild = 30; } Для объекта класса Child будет ли сериализовано поле fieldParent и какое значение при десериализации оно примет?

30 Externalizable Вместо реализации интерфейса Serializable можно реализовать Externalizable, который содержит два метода: void writeExternal(ObjectOutput out) void readExternal(ObjectInput in) При использовании этого интерфейса в поток автоматически записывается только идентификация класса. Сохранить и восстановить всю информацию о состоянии экземпляра должен сам класс. При восстановлении Externalizable -объекта экземпляр создается путем вызова конструктора без аргументов, после чего вызывается метод readExternal() Для сохранения состояния вызываются методы ObjectOutput. Для корректной работы в соответствующем методе readExternal() эти значения должны быть считаны в том же порядке

31 Ключевые моменты Класс File Паттерн Strategy Паттерн Decorator, иерархия классов ввода/вывода java Классы DatalnputStream/DataOutputStream (платформенно- и машинно-независимый обмен данными) RandomAccessFile Перенаправление стандартного ввода/вывода Новый ввод/вывод (nio) Отображаемые в память файлы Блокировка файлов Сжатие данных Сериализация объектов: интерфейсы Serializable Externalizable