Лекция 4 (Streams).ppt
- Количество слайдов: 37
Язык программирования JAVA Подсистема ввода/вывода
Концепция потоков n Поток – упорядоченный набор байт ¡ ¡ n n Поток из источника для обработки Поток в источник (например, для записи) Классы Stream Классы Reader и Writer
Типы потоков n Классы для работы с потоками находятся в пакете java. io ¡ Потоки устройств (файл, память, сеть) n ¡ Могут быть обернуты в классы-фильтры Фильтры n n Обработка данных по мере поступления (буферизация, архивирование, шифрование) Могут быть соединены с другими фильтрами
Байтовые потоки n Input. Stream ¡ ¡ ¡ File. Input. Stream Object. Input. Stream Filter. Input. Stream n n Buffered. Input. Stream Data. Input. Stream n Output. Stream ¡ ¡ ¡ File. Output. Stream Object. Output. Stream Filter. Output. Stream n n n System. out System. in System. err System. Console n n Buffered. Output. Stream Data. Output. Stream Print. Stream
Чтение и запись байтов n Input. Stream ¡ ¡ ¡ ¡ int read() – чтение одного байта write (int b) – запись одного байта int read (byte[] b) – чтение массива байт void write (byte[] b) – запись массива байт long skip(long n) – пропускает n байт void close() – закрывает поток void flush() – очищает буфер
Чтение из потока ввода byte[] buffer = new byte[20]; try{ int count = System. in. read(buffer); switch (count){ case -1: System. out. println(“end of input”); break; default: System. out. println(new String(buffer)) ; break; } } catch (IOException e){. . . } finally { //Всегда закрывайте поток }
Файловые потоки n File. Input. Stream ¡ n File. Output. Stream ¡ ¡ n available() В конструктор можно передавать имя файла Можно передавать объект File Эти классы работают с байтами
Побайтовое чтение из файлов import java. io. *; public class Copy. Bytes { public static void main(String[] args) throws IOException { File. Input. Stream in = null; File. Output. Stream out = null; try { in = new File. Input. Stream("xanadu. txt"); out = new File. Output. Stream("outagain. txt"); int c; while ((c = in. read()) != -1) { out. write(c); } } finally { if (in != null) { in. close(); } if (out != null) { out. close(); } }
Символьные потоки n Подклассы ¡ ¡ n n Reader Writer Потоки манипулируют строками в формате Unicode Позволяют читать файлы по строкам ¡ read. Line
Чтение строки текста n Для чтения по строкам строк используйте класс Buffered. Reader, который использует метод read. Line() ¡ ¡ System. in приспособлен для побайтового ввода и неудобен в использовании Решение – использование класса-фильтра, который преобразует байты в символы, а затем использовать Buffered. Reader n n Сначала обернуть System. in в Input. Stream. Reader, который преобразует байты в символы Затем обернуть Input. Stream. Reader в Buffered. Reader и вызвать метод read. Line()
Чтение строки текста Buffered. Reader in = null; String s = null; try{ in = new Buffered. Reader(new Input. Stream. Reader(System. in)); while ((s = in. read. Line()). length() != 0){ Sytem. out. println(Double. value. Of(s)); } } catch (IOException e){. . . }
Сканирование строк n Для сканирования строк используется класс Scanner ¡ Разбивает строку на части n n n ¡ ¡ ¡ Пробел Перевод строки Табуляция next() use. Delimiter() Возможно чтение чисел n n n use. Locale next. Int next. Float
Сканирование строк import java. io. *; import java. util. Scanner; public class Scan. Xan { public static void main(String[] args) throws IOException { Scanner s = null; try { s = new Scanner(new Buffered. Reader(new File. Reader("xanadu. txt"))); while (s. has. Next()) { System. out. println(s. next()); } } finally { if (s != null) { s. close(); } }
Форматирование n Классы, реализующие форматирование ¡ ¡ n n n Print. Stream Print. Writer print() println() format()
Форматирование public class Format { public static void main(String[] args) { System. out. format("%f, %1$+020. 10 f %n", Math. PI); } } 3. 141593, +00000003. 1415926536
Буферизация n n Побайтовая запись и чтение очень замедляют работу программы Для буферизации используются классы Buffered. Output. Stream и Buffered. Input. Stream Bufferd. Output. Stream bos = new Buffered. Output. Stream(new File. Output. Stream("test. dat"), 10000); /*1 000 Объектов типа String длиной не больше 6 символов*/ Byte writing begin Wed Nov 08 11: 14: 41 MSK 2005 Byte writing end Wed Nov 08 11: 15: 08 MSK 2005 Buffered writing begin Wed Nov 08 11: 15: 08 MSK 2005 Buffered writing end Wed Nov 08 11: 15: 09 MSK 2005
Буферизация n n Обычно Buffered. Streams добавляются непосредственно перед потоками устройств Buffered. Output. Stream ¡ ¡ ¡ flush() write(byte[])
Соединение потоков n Соединение потоков дает большую гибкость при манипуляции с потоками ¡ Ссылка на поток передается в конструктор другого потока
Соединение потоков Object. Output. Stream Buffered. Output. Stream byte[] Экземпляр класса File. Output. Stream byte[] write. Object() write () 100101011…
Соединение потоков Student st = new Student(“John Smith”); Object. Output. Stream obj. Out = new Object. Output. Stream( new Buffered. Output. Stream( new File. Output. Stream(“test. dat”))); obj. Out. write. Object(st);
Потоки данных n Для записи и чтения простых типов данных и строк используются классы Data. Input. Stream и Data. Output. Stream ¡ ¡ write. Byte write. Int write. Short write. UTF
Соединение потоков n Чтение из файла чисел File. Input. Stream fin = new File. Input. Stream(“test. dat”); Data. Input. Stream din = new Data. Input. Stream(fin); double s = din. read. Double(); n Буферизованное чтение Data. Input. Stream din = new Data. Input. Stream(new Buffered. Input. Stream (new File. Input. Stream(“test. dat”))); double s = din. read. Double();
Работа с файлами n Класс File f = new File (“test. dat”); Если такого файла нет, он НЕ СОЗДАЕТСЯ n n create. New. File Файловый поток
Работа с файлами n Методы ¡ ¡ ¡ can. Read() can. Write() delete() exists() get. Canonical. Path() is. Directory() is. File() list. Files() create. New. File() mkdir() rename. To()
Работа с файлами n n File. separator File. create. Temp. File
Файл с произвольным доступом n Random. Access. File (file, mode) ¡ ¡ Запись простых типов или строк Перемещение на любую позицию файла Чтение данных с любой позиции Запись данных в любую позицию
Файл с произвольным доступом Random. Access. File f = new Random. Access. File (“test. dat”, “r”); Random. Access. File f = new Random. Access. File (“test. dat”, “rw”); n n n skip. Bytes seek get. File. Pointer Length set. Length
Сериализация n Сериализация – механизм сохранения объектов в потоки ¡ ¡ ¡ Необходимо реализовывать интерфейсы Serializable или Externalizable Для предотвращения сохранения полей используется модификатор transient Сериализация производится каскадно
Сериализация n Для сериализации используются классы Object. Input. Stream и Object. Output. Stream public class Member implements Serializable { private int id; private String name; private transient String password; . . . }
Запись объекта в файл n n n Создать объектный поток Вызвать метод write. Object() для записи объекта try { Object. Output. Stream oos = new Object. Output. Stream( new File. Output. Stream("test. dat")); for (int i = 0; i < arr. length; i++) { obj = arr[i]; oos. write. Object(obj); } oos. close(); } catch (IOException e) {. . . }
Чтение объекта из файла n n Метод available() класса Object. Output. Stream всегда возвращает 0 (ноль) Необходимо обращаться к потоку более низкого уровня для получения значения остатка файла try { File. Input. Stream fin = new File. Input. Stream("test. dat"); Object. Input. Stream objin = new Object. Input. Stream(fin); while(fin. available() > 0){ obj = objin. read. Object(); } } catch (IOException e) {. . . }
Язык программирования JAVA Упаковка программ
Упаковка программ n n В java есть возможность собирать программы в один файл Утилита JAR создает архив и упаковывает классы в этот архив
Синтаксис jar cvf my. Project. jar bin/* n n Создает архив my. Project. jar, включая в него файлы из подкаталога bin текущего каталога Ключи архиватора ¡ ¡ ¡ с – создание архива v – выводить подробный отчет о процессе f – для указания имени архива
Запуск упакованных программ java –jar my. Project. jar n Как узнать, метод main какого класса необходимо выполнить?
Файл manifest. mf n Для указания стартового класса и подключаемых библиотек создается файл манифеста Main-Class: sample. logic. Human. Resource Class-Path: xerces. jar mylibrary. jar cvfm hr. jar manifest. mf bin/* n Будет создан каталог META-INF, в котором будет находиться файл манифеста
Вопросы?