
- •Потоки ввода/вывода (Java I/O Fundamentals)
- •Содержание лекции
- •Литература
- •Потоки ввода / вывода
- •Символьные и байтовые потоки
- •Символьные потоки
- •Символьные потоки
- •Чтение текстового файла
- •Буферизированный ввод/вывод
- •Пример:
- •Правильно освобождаем ресурсы
- •Разбиваем текстовый файл на лексемы
- •Разбиваем текстовый файл на лексемы
- •Байтовые потоки
- •Чтение потока байтов
- •Чтение потока байтов
- •Потоки работающие с примитивными типами
- •Потоки работающие с примитивными типами
- •Сериализация объектов
- •Сериализация объектов
- •Десериализация объектов
- •Чтение и запись информации с консоли
- •Важные методы класса Console
- •Форматированный ввод /вывод в классе Console
- •Что необходимо помнить
- •Вопросы ?
Потоки ввода/вывода (Java I/O Fundamentals)
2017

Содержание лекции
1.Потоки ввода/вывода.
2.Использование потоков для чтения и записи данных в файл.
3.Сериализация.
4.Чтение и запись информации с консоли.
Литература
1.Герберт Шилдт "Java 7. Полное руководство" (8-е издание). Гл. 19. стр. 595-639
2.Oracle Certified Professional Java SE 7 Programmer Exams 1Z0-804 and 1Z0-805: A Comprehensive OCPJP 7 Certification Guide. Гл. 8. стр. 225-250.

Потоки ввода / вывода
Поток (Stream) – это абстракция, которая представляет собой последовательность передаваемых или принимаемых данных. Потоки ввода/вывода используются для передачи данных в файловые потоки, на консоль или на сетевые соединения. Потоки представляют собой объекты соответствующих классов. Библиотека ввода/вывода предоставляет пользователю большое число классов и методов и постоянно обновляется. Некоторые потоки просто передают данные, другие обрабатывают и преобразовывают их в удобном виде.
Программа использует входной поток для чтения данных из источника, последовательно
Чтение информации в программе
Программа использует выходной поток для записи данных в пункт назначения, последовательно
Запись информации из программы

Символьные и байтовые потоки
Файлы которые используются в работе за компьютером можно условно разделить на две группы. Это текстовые файлы, которые может прочитать человек (например .java) и двоичные файлы хранящие информацию для обработки программой, которые нечитаемы для человека (например .exe).
Пакет java.io содержит классы для поддержки символьных и байтовых потоков. Символьные потоки используются для текстового I/O, байтовые потоки для I/O данных различного формата.
Если вы попробуйте использовать байтовый поток там где нужен поток символов или наоборот, вы получите неприятный сюрприз в ваших программах. Например, файлы растровых изображений ( .bmp) должны быть обработаны с использованием потока байтов и если вы попробуйте использовать символьный поток, ваша программа не будет работать корректно. Так что не перепутайте потоки!

Символьные потоки
Reader
BufferedReader |
FilterReader PipedReader |
InputStreamReader StringReader |
LineNumberReader |
PushbackReader |
FileReader |

Символьные потоки
|
|
Writer |
BufferedWriter |
FilterWriter |
PrintWriter OutputStreamWriter StringWriter |
PipedWriter |
FileWriter |

Чтение текстового файла |
В качестве примера рассмотрим программу выводящую содержимое текстового |
файла на консоль. |
Попытка открыть файл |
через FileReader |
Цикл пока есть символы для |
считывания. Если достигнут конец |
файла, метод read вернет -1 |
try-with-resources автоматически |
освободит объект FileReader |

Буферизированный ввод/вывод
В предыдущем примере для чтения текстового файла создавался символьный поток следующим образом:
FileReader inputFile = new FileReader(file);
При этом используется небуферизованный ввод/вывод, который является менее эффективным по сравнению с буферизированным вводом/выводом. Использования временного внутреннего буфера, который позволит ускорить ввод/вывод. Чтобы программно использовать буфер ввода/вывода, можно передать ссылку на FileReader объекту BufferedReader следующим образом:
Аналогичным образом можно использовать BufferedWriter для буферизации записи. Для потока байтов используются свои классы, такие как BufferedInputStream.
Чтение построчно
Символьный ввод/вывод обычно происходит более крупными порциями чем посимвольно. Одним из распространенных является строковой ввод/вывод.
Конец строки может обозначаться последовательностью символов возврата каретки (CR) и перевода строки (LF) - "\r\n", либо одним из этих символов. Поддерживаемые возможные варианты конца строки что позволяет программам для чтения текстовых файлов, созданных на любой из широко используемых ОС.
Для считывания строки в классе FileReader есть метод readLine().
Метод возвращает строку типа String не включающую символов конца строки или null, если был достигнут конец потока.

Пример: |
Программа для копирования файла построчно вызывает методы |
BufferedReader.readLine и PrintWriter.println считывая и записывая по целой строке |
за раз. |
Цикл пока метод не |
вернет null |
Так как в данном случае try-with-resources не |
использовалось, прийдется закрыть потоки |