- •Механизмы ввода и вывода
- •План лекции
- •Обмен данными
- •Традиционно, проблемы!
- •Потоки данных
- •Разновидности потоков
- •Структура пакета java.io
- •Разновидности потоков
- •Класс InputStream
- •Класс OutputStream
- •Класс Reader
- •Класс Writer
- •Классы потоков ввода и вывода
- •Иерархия байтовых потоков
- •Иерархия символьных потоков
- •Забавная особенность
- •Группа потоков Print
- •Группа байтовых потоков ByteArray
- •Группа байтовых потоков ByteArray
- •Группы символьных потоков CharArray и String
- •Группа потоков File
- •Классы-трансляторы
- •InputStreamReader и
- •Группа потоков Filter
- •Группа потоков Buffered
- •Группа потоков Buffered
- •Группа потоков Piped
- •Группа потоков Piped
- •Класс StreamTokenizer
- •Класс StreamTokenizer
- •Группа байтовых потоков Data
- •Группа байтовых потоков Data
- •Класс File
- •Класс File
- •Пример записи в текстовый файл
- •Пример чтения из текстового файла и из консоли
- •Пример записи в байтовый файл
- •Пример чтения из байтового файла
- •Соответствие классов для байтовых и символьных потоков
- •Соответствие классов для байтовых и символьных потоков
- •Сериализация объектов
- •Сериализация объектов
- •Группа байтовых потоков Object
- •Пример сериализации в файл
- •Пример десериализации из файла
- •Сравнение исходного и восстановленного объектов
- •Подготовка классов к сериализации
- •Порядок сериализации и десериализации
- •Пример иерархии классов
- •Результаты десериализации
- •Порядок сериализации
- •Порядок десериализации
- •Сериализация связанных объектов
- •Настройка сериализации
- •Настройка сериализации
- •Контроль версий
- •Спасибо за внимание!
- •Дополнительные источники
Группа потоков File
FileInputStream, FileReader
FileOutputStream, FileWriter
Позволяют трактовать файл как поток, предназначенный для ввода и вывода данных
Связаны с исключениями FileNotFoundException и
SecurityException
Конструкторы могут получать параметры:
Строку String, задающую имя файла
Объект класса File
Объект FileDescriptor
(возвращается методом getFD() байтовых потоков)
21
Классы-трансляторы
Позволяют читать из байтового как из символьного
изаписывать в байтовый поток как в символьный (с учетом кодировки)
InputStreamReader
InputStreamReader(InputStream in)
InputStreamReader(InputStream in, String encoding) throws UnsupportedEncodingException
OutputStreamWriter
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out, String encoding) throws UnsupportedEncodingException
22
InputStreamReader и
OutputStreamWriter
InputStream inputStream = new FileInputStream("c:\\input.txt");
Reader reader = new InputStreamReader(inputStream, "UTF-8");
int data = reader.read(); while(data != -1){
char с = (char) data; data = reader.read();
}
reader.close();
OutputStream outputStream = new FileOutputStream("c:\\out.txt");
Writer writer = new OutputStreamWriter(outputStream, "UTF-8");
writer.write("The very first line");
writer.close();
23
Группа потоков Filter
FilterInputStream, FilterReader
FilterOutputStream, FiltrerWriter
Обертки, позволяют объединять потоки в цепочки для получения сложных потоков, обладающих расширенным набором функций
Обладают дополнительными защищенными
конструкторами
protected FilterInputStream(InputStream in)
В наследниках обычно переопределяются методы чтения/записи с добавлением новой функциональности
24
Группа потоков Buffered
BufferedInputStream, BufferedReader
BufferedOutputStream, BufferedWriter
Обертки, осуществляют буферизацию данных на программном уровне
Размер буфера можно задать в конструкторе
Символьные версии имеют методы чтения строк
ивставки символа новой строки:
readLine(), newLine()
25
Группа потоков Buffered
InputStream in = new BufferedInputStream(
new FileInputStream("c:\\in.bin"), 8 * 1024);
OutputStream out = new BufferedOutputStream(
new FileOutputStream("c:\\out.bin"), 8 *
1024);
Reader input = new BufferedReader(
new FileReader("c:\\in.txt"), 8 * 1024);
Writer writer = new BufferedWriter(
new FileWriter("c:\\out.txt"), 8 * 1024);
BufferedReader input = new BufferedReader(
new InputStreamReader(System.in)); String s = input.readLine();
System.out.println("Input string is: " + s);
26
Группа потоков Piped
PipedInputStream, PipedReader
PipedOutputStream, PipedWriter
Используются в виде пар ввода-вывода
Данные, переданные в поток вывода, служат источником для потока ввода
Например, реализуют механизм обмена данными между нитями
Поток-пара задается параметром конструктора либо с помощью метода connect()
27
Группа потоков Piped
OutputStream pipedOutputStream = new PipedOutputStream();
while(moreData) {
int data = getMoreData(); pipedOutputStream.write(data);
}
output.close();
InputStream input = new PipedInputStream(pipedOutputStream);
int data = input.read(); while(data != -1) {
doSomethingWithData(data); data = input.read();
}
input.close();
28
Класс StreamTokenizer
Не является потоком чтения, но позволяет обрабатывать информацию из них
Содержит методы лексической обработки текста
Ряд методов предназначен для настройки работы анализатора
Метод nextToken() производит обработку очередной лексемы, после чего:
Поле ttype содержит константу типа лексемы
Поля nval и sval содержат числовое и строковое представление лексемы
29
Класс StreamTokenizer
StreamTokenizer tokenizer = new StreamTokenizer( new StringReader("This is example string"));
while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){
if(tokenizer.ttype == StreamTokenizer.TT_WORD) { System.out.println(tokenizer.sval);
}else if(tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println(tokenizer.nval);
}else if(tokenizer.ttype == StreamTokenizer.TT_EOL) {
System.out.println();
}
}
30