SlideShare a Scribd company logo
Работа с файлами.
Виталий Унгурян
unguryan@itstep.org
Класс File
File — единственный класс в java.io,
который работает непосредственно с
дисковыми файлами.
Его задачей является управление
информацией о файлах и каталогах.
Класс File
Хотя на уровне операционной
системы файлы и каталоги
отличаются, но в Java они
описываются одним классом File.
Класс File
boolean createNewFile():
создает новый файл по пути, который
передан в конструктор. В случае
удачного создания возвращает true,
иначе false
boolean delete():
удаляет каталог или файл по пути,
который передан в конструктор. При
удачном удалении возвращает true.
Класс File
String getAbsolutePath():
возвращает абсолютный путь для пути,
переданного в конструктор объекта
String getName():
возвращает краткое имя файла или
каталога
String getParent():
возвращает имя родительского каталога
Класс File
boolean isDirectory(): возвращает
значение true, если по указанному пути
располагается каталог
boolean isFile(): возвращает значение
true, если по указанному пути находится
файл
boolean isHidden(): возвращает значение
true, если каталог или файл являются
скрытыми
Класс File
long length():
возвращает размер файла в байтах
long lastModified():
возвращает время последнего
изменения файла или каталога.
Значение представляет количество
миллисекунд, прошедших с начала
эпохи Unix
Класс File
String[] list():
возвращает массив файлов и
подкаталогов, которые находятся в
определенном каталоге
File[] listFiles():
возвращает массив файлов и
подкаталогов, которые находятся в
определенном каталоге
Класс File
boolean mkdir():
создает новый каталог и при удачном
создании возвращает значение true
boolean renameTo(File dest):
переименовывает файл или каталог
Интерфейс FilenameFilter
Объекту, чтобы реализовать этот
интерфейс, требуется определить
только один метод — accept(), который
будет вызываться один раз с каждым
новым именем файла.
Метод accept должен возвращать true
для тех имён, которые надо включать в
список, и false для имён, которые
следует исключить.
ввод/вывод
Обобщённое понятие источника
ввода относится к различным
способам получения
информации: к чтению
дискового файла, символов с
клавиатуры либо получению
данных из сети.
ввод/вывод
Под обобщённым понятием вывода
также могут пониматься дисковые
файлы, сетевое соединение и т. п.
Эти абстракции дают удобную
возможность для работы с вводом-
выводом (I/O), не требуя при этом, чтобы
каждая часть вашего кода понимала
разницу между, скажем, клавиатурой и
сетью.
ввод/вывод
В Java абстракция ввода/вывода
называется потоком (stream) и
реализована в нескольких
классах пакета java.io.
ввод/вывод
Ввод данных инкапсулирован в
абстрактном классе InputStream,
Вывод данных — в
OutputStream.
По течению грести легче
Потоки ввода/вывода в Java
предоставляют программисту ясную
абстракцию для выполнения
сложных и зачастую громоздких
операций ввода - вывода данных.
По течению грести легче
Java - программы, опирающиеся на
абстракции высокого уровня -
классы InputStream и OutputStream,
будут и в будущем функционировать
правильно - даже тогда, когда будут
изобретены новые улучшенные
реализации классов ввода - вывода.
Класс OutputStream
OutputStream — абстрактный класс.
Задаёт модель выходных потоков
Java. Все методы этого класса
имеют тип void и возбуждают
исключение IOException в случае
ошибки.
Класс InputStream
InputStream — абстрактный класс,
задающий используемую в Java
модель входных потоков. Все
методы этого класса при
возникновении ошибки возбуждают
исключение IOException.
Файловый поток FileOutputStream
FileOutputStream — простейший класс
для потокового (последовательного)
вывода байтов в файл.
Объект этого класса создается на
основе объекта File или по имени файла
в файловой системе. Создавать
объекты этого класса можно независимо
от того, существует файл или нет.
Файловый поток FilelnputStream
FilelnputStream - простейший класс
для потокового (последовательного)
чтения байтов из файла.
Объект этого класса создаётся на
основе объекта File или по имени
файла в файловой системе.
DataInputStream
DataInputStream - класс для
потокового (последовательного)
чтения данных стандартных
типов из файла.
Объект этого класса создается
на основе объекта InputStream
Фильтруемые потоки
Все конструкторы и методы,
имеющиеся в этом классе,
идентичны тем, которые есть в
классах InputStream и OutputStream,
единственное отличие классов
фильтруемых потоков в том, что их
методы синхронизированы.
Буферизованные потоки
При не буферизованном вводе-выводе
каждое чтение, или запрос записи
обрабатывается непосредственно
базовым ОС. Это может сделать
программу намного менее эффективной,
так как каждый такой запрос часто
инициировал доступ к диску, сетевое
действие, или некоторую другую работу,
которая относительно дорога.
Буферизованные Потоки
Чтобы уменьшить этот вид издержек,
платформа Java реализует
буферизованные потоки ввода-вывода.
Буферизованные входные потоковые
данные чтения от области памяти,
известной как буфер; собственный
входной API вызывают только, когда
буфер пуст.
Буферизованные Потоки
Точно так же буферизованные потоки
вывода пишут данные в буфер, и
собственный выходной API вызывают
только, когда буфер полон.
Буферизованные потоки являются
расширением классов фильтруемых
потоков
Классы BufferedInputStream и
BufferedOutputStream
Классы BufferedInputStream и
BufferedOutputStream используют
буферизованный ввод-вывод,
поэтому работают более
эффективно, чем, например,
FileInputStream и FileOutputStream.
Классы BufferedReader и BufferedWriter
Используются для
буферизованного ввода-вывода
данных, поэтому их использование
более эффективно, чем, например,
FileReader и FileWriter.
Создаются на основе объектов
Reader и Writer
Класс RandomAccessFile
RandomAccessFile - класс для
произвольного доступа,
используется как для чтения,
так и для записи. Объект этого
класса cоздается на основе
объекта File или по имени
файла в файловой системе.
Классы PipedInputStream и PipedOutputStream
Классы для канальных потоков
ввода-вывода. Хорошо подходят
для обмена информацией между
процессами.
Канальные потоки
Канальные потоки (piped streams),
определяемые классами семейства
Piped — используются в виде пар
ввода-вывода (записи-чтения);
данные, переданные в поток вывода
(записи), служат источником для
потока ввода (чтения).
Канальные потоки
С каналом (pipe) связан внутренний
буфер, ёмкость которого
определяется при реализации класса,
что позволяет поддерживать разные
уровни производительности
процессов вывода и ввода; однако
средств динамического управления
размером буфера не существует.
Класс ByteArraylnputStream
ByteArrayInputStream - это реализация
входного потока, в котором в качестве
источника используется массив типа
byte.
У этого класса два конструктора,
каждый из которых в качестве первого
параметра требует байтовый массив.
Класс ByteArrayOutputStream
ByteArrayOutputStream — два
конструктора. Первая форма
конструктора создаёт буфер размером
32 байта. При использовании второй
формы создаётся буфер с размером,
заданным параметром конструктора.
Класс PushbacklnputStream
Одно из необычных применений
буферизации — реализация операции
pushback (вернуть назад). Pushback
применяется к InputStream для того,
чтобы после прочтения символа
вернуть его обратно во входной поток.
Класс SequencelnputStream
Класс SequencelnputStream
поддерживает возможность
слияния нескольких входных
потоков в один.
В конструкторе класса SequenceInputStream в
качестве параметра используется либо два
объекта InputStream, либо перечисление,
содержащее коллекцию объектов InputStream
Класс PrintStream
Класс PrintStream предоставляет все те
утилиты форматирования, которые мы
использовали в примерах для вывода
через файловые дескрипторы пакета
System с самого начала.
Символьные потоки
Символьные потоки имеют два
основных абстрактных класса
Reader и Writer, управляющие
потоками символов Unicode.
Символьные потоки
BufferedReader - буферизированный
входной символьный поток, увеличивает
производительность за счёт
буферизации ввода.
CharArrayReader - входной поток,
который читает из символьного массива
Символьные потоки
FileReader - входной поток, читающий
текстовый файл.
FilterReader - фильтрующий читатель.
InputStreamReader - входной поток,
транслирующий байты в символы.
LineNumberReader - входной поток,
подсчитывающий строки
Символьные потоки
PipedReader - входной канал
PushbackReader - входной поток,
позволяющий возвращать символы
обратно в поток.
StringReader - входной поток, читающий
из строки.
Сериализация объектов
Сериализация - это процесс
сохранения состояния объекта в
последовательность байт.
Десериализация - это процесс
восстановления объекта, из байтового
состояния.
Зачем сериализация нужна?
В сегодняшнем мире типичное
промышленное приложение будет
иметь множество компонентов
и будет
распространено
через различные
системы и сети.
Зачем сериализация нужна?
В Java всё представлено в виде
объектов!
Если двум компонентам Java
необходимо общаться друг с другом, то
им необходим механизм для обмена
данными.
Зачем сериализация нужна?
Первый способ это разработать
собственный протокол и передать
объект.
Это означает, что получатель должен
знать протокол, используемый
отправителем для воссоздания
объекта, что усложняет разработку
сторонних компонентов.
Зачем сериализация нужна?
Следовательно, должен быть
универсальный и эффективный
протокол передачи объектов между
компонентами.
Сериализация создана для этого, и
компоненты Java используют этот
протокол для передачи объектов.
Первый способ сериализации
Класс сериализуемого объекта должен
реализовывать интерфейс
import java.io.Serializable;
class TestSerial implements Serializable {
}
Интерфейс Serializable это интерфейс-маркер; в
нём не задекларировано ни одного метода. Но
говорит сериализующему механизму, что класс
может быть сериализован.
Алгоритм сериализации Java
запись метаданных о классе
ассоциированном с объектом
рекурсивная запись описания
суперклассов, до тех пор пока не будет
достигнут java.lang.object
Алгоритм сериализации Java
после окончания записи метаданных
начинается запись фактических
данных ассоциированных с
экземпляром, только в этот раз
начинается запись с самого верхнего
суперкласса
рекурсивная запись данных
ассоциированных с экземпляром
начиная с самого низшего суперкласса
Алгоритм сериализации Java
Сохранение объекта выполняется при
помощи класса
java.io.ObjectOutputStream.
Который является фильтрующим
потоком (filter stream) - он окружает
низкоуровневый поток байтов
(называемый узловым потоком (node
stream)) и предоставляет нам поток
сериализации.
Не сериализуемые объекты
Сохраняться могут лишь объекты,
помеченные как Serializable. Класс
java.lang.Object не реализует этот
интерфейс, поэтому не все объекты
Java могут быть автоматически
сохранены.
Часть классов, включая AWT,
компоненты Swing GUI, строки и
массивы - сериализуемые.
Реализация сериализации
Используя встроенную возможность
механизма сериализации, можно
реализовать нормальный процесс
поместив в свои класс два метода:
private void writeObject(ObjectOutputStream
out) throws IOException;
private void readObject(ObjectInputStream
in) throws IOException,
ClassNotFoundException;
Остановите сериализацию!
Что если вы создали класс, чей
суперкласс сериализуемый, но при этом
вы не хотите чтобы ваш класс был
сериализуемым?
Вы не можете "разреализовать"
интерфейс, поэтому если суперкласс
реализует Serializable, то и созданный
вами новый класс также будет его
реализовать.
Остановите сериализацию!
Чтобы остановить автоматическую
сериализацию вы можете снова
применить private методы для создания
исключительной ситуации
NotSerializableException.
Создание своего собственного
протокола: интерфейс Externalizable
Вместо реализации интерфейса
Serializable, вы можете реализовать
интерфейс Externalizable, который
содержит два метода:
public void writeExternal(ObjectOutput out)
throws IOException;
public void readExternal(ObjectInput in) throws
IOException, ClassNotFoundException;
Кэширование объектов в потоке
По умолчанию, ObjectOutputStream
сохраняет ссылки на объекты, которые
в него записываются. Это означает,
что если состояние записываемого
объекта, который уже был записан,
будет записано снова, новое
состояние не сохраняется!
Граф сериализации
При сериализации связанных объектов
имеет место граф сериализации.
Граф сериализации
Сериализуется объект, если он
содержит ссылки или массивы ссылок
на сериализуемые объекты, то они
сериализуются рекурсивно. При этом
сериализуемые объекты помечаются,
что исключает зацикливание при
обходе графа.
Граф сериализации
Кроме того, для сериализуемых объектов
создаются уникальные идентификаторы,
которые необходимы для восстановления
ссылок при десериализации. Т.е. при первой
сериализации объект передаётся «по
полной программе» и для него создаётся
внутренний идентификатор, если алгоритм
повторно «натыкается» на помеченный
объект, то передаётся только его
идентификатор.

More Related Content

What's hot

Исключения и ошибки
Исключения и ошибкиИсключения и ошибки
Исключения и ошибки
Unguryan Vitaliy
 
java 8
java 8java 8
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
Unguryan Vitaliy
 
Java. Полиморфизм.
Java. Полиморфизм.Java. Полиморфизм.
Java. Полиморфизм.
Unguryan Vitaliy
 
Java. Generic - шаблонные типы.
Java.  Generic - шаблонные типы.Java.  Generic - шаблонные типы.
Java. Generic - шаблонные типы.
Unguryan Vitaliy
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
Unguryan Vitaliy
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
Unguryan Vitaliy
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в java
Unguryan Vitaliy
 
Сервлеты
СервлетыСервлеты
Сервлеты
Unguryan Vitaliy
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода выводаmetaform
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
metaform
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
Unguryan Vitaliy
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
muqaddas_m
 
Step 3.2
Step 3.2Step 3.2
Step 3.2
DmitryTrushkin
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
Igor Shkulipa
 

What's hot (15)

Исключения и ошибки
Исключения и ошибкиИсключения и ошибки
Исключения и ошибки
 
java 8
java 8java 8
java 8
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 
Java. Полиморфизм.
Java. Полиморфизм.Java. Полиморфизм.
Java. Полиморфизм.
 
Java. Generic - шаблонные типы.
Java.  Generic - шаблонные типы.Java.  Generic - шаблонные типы.
Java. Generic - шаблонные типы.
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в java
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
работа с потоками ввода вывода
работа с потоками ввода выводаработа с потоками ввода вывода
работа с потоками ввода вывода
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
 
Step 3.2
Step 3.2Step 3.2
Step 3.2
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
 

Viewers also liked

Java. Интерфейс Reference - типы ссылок
Java. Интерфейс Reference -  типы ссылокJava. Интерфейс Reference -  типы ссылок
Java. Интерфейс Reference - типы ссылок
Unguryan Vitaliy
 
Java. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьJava. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередь
Unguryan Vitaliy
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
Unguryan Vitaliy
 
Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.
Unguryan Vitaliy
 
Java. Наследование.
Java. Наследование.Java. Наследование.
Java. Наследование.
Unguryan Vitaliy
 
Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация
Unguryan Vitaliy
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
Unguryan Vitaliy
 
List - списки
List - списки List - списки
List - списки
Unguryan Vitaliy
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.
Unguryan Vitaliy
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
Unguryan Vitaliy
 
Java. Циклы.
Java. Циклы.Java. Циклы.
Java. Циклы.
Unguryan Vitaliy
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.
Unguryan Vitaliy
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
Unguryan Vitaliy
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
Unguryan Vitaliy
 
XML
XMLXML

Viewers also liked (16)

Java. Интерфейс Reference - типы ссылок
Java. Интерфейс Reference -  типы ссылокJava. Интерфейс Reference -  типы ссылок
Java. Интерфейс Reference - типы ссылок
 
Java. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьJava. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередь
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
 
Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.
 
Java. Наследование.
Java. Наследование.Java. Наследование.
Java. Наследование.
 
Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
 
List - списки
List - списки List - списки
List - списки
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
 
Java. Циклы.
Java. Циклы.Java. Циклы.
Java. Циклы.
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.
 
Uml
UmlUml
Uml
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
 
XML
XMLXML
XML
 

Similar to Java. Работа с файловой системой. Потоки ввода-вывода.

Msu.Center.Lectures.J06 Io
Msu.Center.Lectures.J06 IoMsu.Center.Lectures.J06 Io
Msu.Center.Lectures.J06 Ioolegol
 
06 Ввод-вывод
06 Ввод-вывод06 Ввод-вывод
06 Ввод-выводphearnot
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
Igor Shkulipa
 
Java. Lecture 06. I/O
Java. Lecture 06. I/OJava. Lecture 06. I/O
Java. Lecture 06. I/Ocolriot
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture ioMERA_school
 
06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе
Roman Brovko
 
Лекция 5
Лекция 5Лекция 5
Лекция 5itc73
 
Курс Java-2016. Занятие 06. Файлы и ввод-вывод
Курс Java-2016. Занятие 06. Файлы и ввод-выводКурс Java-2016. Занятие 06. Файлы и ввод-вывод
Курс Java-2016. Занятие 06. Файлы и ввод-вывод
7bits
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
Igor Shkulipa
 
Java осень 2013 лекция 7
Java осень 2013 лекция 7Java осень 2013 лекция 7
Java осень 2013 лекция 7Technopark
 
основные пространства имен и классы microsoft
основные пространства имен и классы microsoftосновные пространства имен и классы microsoft
основные пространства имен и классы microsoft
mcroitor
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекцийstudent_kai
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
Unguryan Vitaliy
 
Lec 5
Lec 5Lec 5
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Java
metaform
 
08-170327133157.pdf
08-170327133157.pdf08-170327133157.pdf
08-170327133157.pdf
ssuser0562f1
 
JDBC
JDBCJDBC
ProveIT. ETL как конструктор алгоритмов обработки данных.
ProveIT. ETL как конструктор алгоритмов обработки данных.ProveIT. ETL как конструктор алгоритмов обработки данных.
ProveIT. ETL как конструктор алгоритмов обработки данных.
chester_ds
 

Similar to Java. Работа с файловой системой. Потоки ввода-вывода. (20)

Step 6
Step 6Step 6
Step 6
 
Msu.Center.Lectures.J06 Io
Msu.Center.Lectures.J06 IoMsu.Center.Lectures.J06 Io
Msu.Center.Lectures.J06 Io
 
06 Ввод-вывод
06 Ввод-вывод06 Ввод-вывод
06 Ввод-вывод
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
 
Java. Lecture 06. I/O
Java. Lecture 06. I/OJava. Lecture 06. I/O
Java. Lecture 06. I/O
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture io
 
06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе
 
Лекция 5
Лекция 5Лекция 5
Лекция 5
 
Курс Java-2016. Занятие 06. Файлы и ввод-вывод
Курс Java-2016. Занятие 06. Файлы и ввод-выводКурс Java-2016. Занятие 06. Файлы и ввод-вывод
Курс Java-2016. Занятие 06. Файлы и ввод-вывод
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
Java осень 2013 лекция 7
Java осень 2013 лекция 7Java осень 2013 лекция 7
Java осень 2013 лекция 7
 
основные пространства имен и классы microsoft
основные пространства имен и классы microsoftосновные пространства имен и классы microsoft
основные пространства имен и классы microsoft
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекций
 
лабраб 4
лабраб 4лабраб 4
лабраб 4
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
 
Lec 5
Lec 5Lec 5
Lec 5
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Java
 
08-170327133157.pdf
08-170327133157.pdf08-170327133157.pdf
08-170327133157.pdf
 
JDBC
JDBCJDBC
JDBC
 
ProveIT. ETL как конструктор алгоритмов обработки данных.
ProveIT. ETL как конструктор алгоритмов обработки данных.ProveIT. ETL как конструктор алгоритмов обработки данных.
ProveIT. ETL как конструктор алгоритмов обработки данных.
 

More from Unguryan Vitaliy

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование.
Unguryan Vitaliy
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
Unguryan Vitaliy
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектами
Unguryan Vitaliy
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
Unguryan Vitaliy
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
Unguryan Vitaliy
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.
Unguryan Vitaliy
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
Unguryan Vitaliy
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
Unguryan Vitaliy
 
Cookies, session и другое в JSP
Cookies, session и другое в JSPCookies, session и другое в JSP
Cookies, session и другое в JSP
Unguryan Vitaliy
 
JSTL
JSTLJSTL
JSP
JSPJSP

More from Unguryan Vitaliy (11)

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование.
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектами
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Cookies, session и другое в JSP
Cookies, session и другое в JSPCookies, session и другое в JSP
Cookies, session и другое в JSP
 
JSTL
JSTLJSTL
JSTL
 
JSP
JSPJSP
JSP
 

Java. Работа с файловой системой. Потоки ввода-вывода.

  • 1. Работа с файлами. Виталий Унгурян unguryan@itstep.org
  • 2. Класс File File — единственный класс в java.io, который работает непосредственно с дисковыми файлами. Его задачей является управление информацией о файлах и каталогах.
  • 3. Класс File Хотя на уровне операционной системы файлы и каталоги отличаются, но в Java они описываются одним классом File.
  • 4. Класс File boolean createNewFile(): создает новый файл по пути, который передан в конструктор. В случае удачного создания возвращает true, иначе false boolean delete(): удаляет каталог или файл по пути, который передан в конструктор. При удачном удалении возвращает true.
  • 5. Класс File String getAbsolutePath(): возвращает абсолютный путь для пути, переданного в конструктор объекта String getName(): возвращает краткое имя файла или каталога String getParent(): возвращает имя родительского каталога
  • 6. Класс File boolean isDirectory(): возвращает значение true, если по указанному пути располагается каталог boolean isFile(): возвращает значение true, если по указанному пути находится файл boolean isHidden(): возвращает значение true, если каталог или файл являются скрытыми
  • 7. Класс File long length(): возвращает размер файла в байтах long lastModified(): возвращает время последнего изменения файла или каталога. Значение представляет количество миллисекунд, прошедших с начала эпохи Unix
  • 8. Класс File String[] list(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге File[] listFiles(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге
  • 9. Класс File boolean mkdir(): создает новый каталог и при удачном создании возвращает значение true boolean renameTo(File dest): переименовывает файл или каталог
  • 10. Интерфейс FilenameFilter Объекту, чтобы реализовать этот интерфейс, требуется определить только один метод — accept(), который будет вызываться один раз с каждым новым именем файла. Метод accept должен возвращать true для тех имён, которые надо включать в список, и false для имён, которые следует исключить.
  • 11. ввод/вывод Обобщённое понятие источника ввода относится к различным способам получения информации: к чтению дискового файла, символов с клавиатуры либо получению данных из сети.
  • 12. ввод/вывод Под обобщённым понятием вывода также могут пониматься дисковые файлы, сетевое соединение и т. п. Эти абстракции дают удобную возможность для работы с вводом- выводом (I/O), не требуя при этом, чтобы каждая часть вашего кода понимала разницу между, скажем, клавиатурой и сетью.
  • 13. ввод/вывод В Java абстракция ввода/вывода называется потоком (stream) и реализована в нескольких классах пакета java.io.
  • 14. ввод/вывод Ввод данных инкапсулирован в абстрактном классе InputStream, Вывод данных — в OutputStream.
  • 15. По течению грести легче Потоки ввода/вывода в Java предоставляют программисту ясную абстракцию для выполнения сложных и зачастую громоздких операций ввода - вывода данных.
  • 16. По течению грести легче Java - программы, опирающиеся на абстракции высокого уровня - классы InputStream и OutputStream, будут и в будущем функционировать правильно - даже тогда, когда будут изобретены новые улучшенные реализации классов ввода - вывода.
  • 17. Класс OutputStream OutputStream — абстрактный класс. Задаёт модель выходных потоков Java. Все методы этого класса имеют тип void и возбуждают исключение IOException в случае ошибки.
  • 18. Класс InputStream InputStream — абстрактный класс, задающий используемую в Java модель входных потоков. Все методы этого класса при возникновении ошибки возбуждают исключение IOException.
  • 19. Файловый поток FileOutputStream FileOutputStream — простейший класс для потокового (последовательного) вывода байтов в файл. Объект этого класса создается на основе объекта File или по имени файла в файловой системе. Создавать объекты этого класса можно независимо от того, существует файл или нет.
  • 20. Файловый поток FilelnputStream FilelnputStream - простейший класс для потокового (последовательного) чтения байтов из файла. Объект этого класса создаётся на основе объекта File или по имени файла в файловой системе.
  • 21. DataInputStream DataInputStream - класс для потокового (последовательного) чтения данных стандартных типов из файла. Объект этого класса создается на основе объекта InputStream
  • 22. Фильтруемые потоки Все конструкторы и методы, имеющиеся в этом классе, идентичны тем, которые есть в классах InputStream и OutputStream, единственное отличие классов фильтруемых потоков в том, что их методы синхронизированы.
  • 23. Буферизованные потоки При не буферизованном вводе-выводе каждое чтение, или запрос записи обрабатывается непосредственно базовым ОС. Это может сделать программу намного менее эффективной, так как каждый такой запрос часто инициировал доступ к диску, сетевое действие, или некоторую другую работу, которая относительно дорога.
  • 24. Буферизованные Потоки Чтобы уменьшить этот вид издержек, платформа Java реализует буферизованные потоки ввода-вывода. Буферизованные входные потоковые данные чтения от области памяти, известной как буфер; собственный входной API вызывают только, когда буфер пуст.
  • 25. Буферизованные Потоки Точно так же буферизованные потоки вывода пишут данные в буфер, и собственный выходной API вызывают только, когда буфер полон. Буферизованные потоки являются расширением классов фильтруемых потоков
  • 26. Классы BufferedInputStream и BufferedOutputStream Классы BufferedInputStream и BufferedOutputStream используют буферизованный ввод-вывод, поэтому работают более эффективно, чем, например, FileInputStream и FileOutputStream.
  • 27. Классы BufferedReader и BufferedWriter Используются для буферизованного ввода-вывода данных, поэтому их использование более эффективно, чем, например, FileReader и FileWriter. Создаются на основе объектов Reader и Writer
  • 28. Класс RandomAccessFile RandomAccessFile - класс для произвольного доступа, используется как для чтения, так и для записи. Объект этого класса cоздается на основе объекта File или по имени файла в файловой системе.
  • 29. Классы PipedInputStream и PipedOutputStream Классы для канальных потоков ввода-вывода. Хорошо подходят для обмена информацией между процессами.
  • 30. Канальные потоки Канальные потоки (piped streams), определяемые классами семейства Piped — используются в виде пар ввода-вывода (записи-чтения); данные, переданные в поток вывода (записи), служат источником для потока ввода (чтения).
  • 31. Канальные потоки С каналом (pipe) связан внутренний буфер, ёмкость которого определяется при реализации класса, что позволяет поддерживать разные уровни производительности процессов вывода и ввода; однако средств динамического управления размером буфера не существует.
  • 32. Класс ByteArraylnputStream ByteArrayInputStream - это реализация входного потока, в котором в качестве источника используется массив типа byte. У этого класса два конструктора, каждый из которых в качестве первого параметра требует байтовый массив.
  • 33. Класс ByteArrayOutputStream ByteArrayOutputStream — два конструктора. Первая форма конструктора создаёт буфер размером 32 байта. При использовании второй формы создаётся буфер с размером, заданным параметром конструктора.
  • 34. Класс PushbacklnputStream Одно из необычных применений буферизации — реализация операции pushback (вернуть назад). Pushback применяется к InputStream для того, чтобы после прочтения символа вернуть его обратно во входной поток.
  • 35. Класс SequencelnputStream Класс SequencelnputStream поддерживает возможность слияния нескольких входных потоков в один. В конструкторе класса SequenceInputStream в качестве параметра используется либо два объекта InputStream, либо перечисление, содержащее коллекцию объектов InputStream
  • 36. Класс PrintStream Класс PrintStream предоставляет все те утилиты форматирования, которые мы использовали в примерах для вывода через файловые дескрипторы пакета System с самого начала.
  • 37.
  • 38. Символьные потоки Символьные потоки имеют два основных абстрактных класса Reader и Writer, управляющие потоками символов Unicode.
  • 39. Символьные потоки BufferedReader - буферизированный входной символьный поток, увеличивает производительность за счёт буферизации ввода. CharArrayReader - входной поток, который читает из символьного массива
  • 40. Символьные потоки FileReader - входной поток, читающий текстовый файл. FilterReader - фильтрующий читатель. InputStreamReader - входной поток, транслирующий байты в символы. LineNumberReader - входной поток, подсчитывающий строки
  • 41. Символьные потоки PipedReader - входной канал PushbackReader - входной поток, позволяющий возвращать символы обратно в поток. StringReader - входной поток, читающий из строки.
  • 42.
  • 43. Сериализация объектов Сериализация - это процесс сохранения состояния объекта в последовательность байт. Десериализация - это процесс восстановления объекта, из байтового состояния.
  • 44. Зачем сериализация нужна? В сегодняшнем мире типичное промышленное приложение будет иметь множество компонентов и будет распространено через различные системы и сети.
  • 45. Зачем сериализация нужна? В Java всё представлено в виде объектов! Если двум компонентам Java необходимо общаться друг с другом, то им необходим механизм для обмена данными.
  • 46. Зачем сериализация нужна? Первый способ это разработать собственный протокол и передать объект. Это означает, что получатель должен знать протокол, используемый отправителем для воссоздания объекта, что усложняет разработку сторонних компонентов.
  • 47. Зачем сериализация нужна? Следовательно, должен быть универсальный и эффективный протокол передачи объектов между компонентами. Сериализация создана для этого, и компоненты Java используют этот протокол для передачи объектов.
  • 48. Первый способ сериализации Класс сериализуемого объекта должен реализовывать интерфейс import java.io.Serializable; class TestSerial implements Serializable { } Интерфейс Serializable это интерфейс-маркер; в нём не задекларировано ни одного метода. Но говорит сериализующему механизму, что класс может быть сериализован.
  • 49. Алгоритм сериализации Java запись метаданных о классе ассоциированном с объектом рекурсивная запись описания суперклассов, до тех пор пока не будет достигнут java.lang.object
  • 50. Алгоритм сериализации Java после окончания записи метаданных начинается запись фактических данных ассоциированных с экземпляром, только в этот раз начинается запись с самого верхнего суперкласса рекурсивная запись данных ассоциированных с экземпляром начиная с самого низшего суперкласса
  • 51. Алгоритм сериализации Java Сохранение объекта выполняется при помощи класса java.io.ObjectOutputStream. Который является фильтрующим потоком (filter stream) - он окружает низкоуровневый поток байтов (называемый узловым потоком (node stream)) и предоставляет нам поток сериализации.
  • 52. Не сериализуемые объекты Сохраняться могут лишь объекты, помеченные как Serializable. Класс java.lang.Object не реализует этот интерфейс, поэтому не все объекты Java могут быть автоматически сохранены. Часть классов, включая AWT, компоненты Swing GUI, строки и массивы - сериализуемые.
  • 53. Реализация сериализации Используя встроенную возможность механизма сериализации, можно реализовать нормальный процесс поместив в свои класс два метода: private void writeObject(ObjectOutputStream out) throws IOException; private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
  • 54. Остановите сериализацию! Что если вы создали класс, чей суперкласс сериализуемый, но при этом вы не хотите чтобы ваш класс был сериализуемым? Вы не можете "разреализовать" интерфейс, поэтому если суперкласс реализует Serializable, то и созданный вами новый класс также будет его реализовать.
  • 55. Остановите сериализацию! Чтобы остановить автоматическую сериализацию вы можете снова применить private методы для создания исключительной ситуации NotSerializableException.
  • 56. Создание своего собственного протокола: интерфейс Externalizable Вместо реализации интерфейса Serializable, вы можете реализовать интерфейс Externalizable, который содержит два метода: public void writeExternal(ObjectOutput out) throws IOException; public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
  • 57. Кэширование объектов в потоке По умолчанию, ObjectOutputStream сохраняет ссылки на объекты, которые в него записываются. Это означает, что если состояние записываемого объекта, который уже был записан, будет записано снова, новое состояние не сохраняется!
  • 58. Граф сериализации При сериализации связанных объектов имеет место граф сериализации.
  • 59. Граф сериализации Сериализуется объект, если он содержит ссылки или массивы ссылок на сериализуемые объекты, то они сериализуются рекурсивно. При этом сериализуемые объекты помечаются, что исключает зацикливание при обходе графа.
  • 60.
  • 61. Граф сериализации Кроме того, для сериализуемых объектов создаются уникальные идентификаторы, которые необходимы для восстановления ссылок при десериализации. Т.е. при первой сериализации объект передаётся «по полной программе» и для него создаётся внутренний идентификатор, если алгоритм повторно «натыкается» на помеченный объект, то передаётся только его идентификатор.