Скачать презентацию 1 Java Express 4 Потоки Параметризуемые классы и Скачать презентацию 1 Java Express 4 Потоки Параметризуемые классы и

04 Потоки. Параметризация. Массивы.ppt

  • Количество слайдов: 21

1 Java Express 4. Потоки. Параметризуемые классы и методы. Массивы. 1 Java Express 4. Потоки. Параметризуемые классы и методы. Массивы.

2 Класс java. io. File n public class File Служит для выполнения операций с 2 Класс java. io. File n public class File Служит для выполнения операций с файлом или каталогом как целым: создание, удаление, переименование, проверка/установка атрибутов, проверка существования, получение размера файла, получение списка файлов в каталоге и т. п. ¨ Конструкторы: по заданному пути, по двум путям (к родительскому каталогу и к потомку), по объекту File (описывающему каталог) и пути к потомку. ¨ Разделители пути зависят от используемой ОС. Для Windows это '\'. ¨ n Некоторые методы: boolean exists(), delete(), rename. To(File dest); boolean is. File(), is. Directory(), mkdir(); boolean create. New. File(); - создает новый файл, если файла с таким именем еще нет в каталоге; ¨ String[] list() - возвращает массив имен файлов (и подкаталогов) в данном каталоге. В конструкторе можно указать фильтр имен; ¨ File[] list. Files() - возвращает массив файлов в данном каталоге. ¨ ¨ ¨

3 Пример использования класса File n Программа выдает список всех файлов типа *. txt 3 Пример использования класса File n Программа выдает список всех файлов типа *. txt из каталога d: tmp. n Чтобы задать фильтр имен, нужен класс, реализующий метод accept интерфейса Filename. Filter. Можно не заводить отдельный класс для этого, а сделать это в основном классе приложения. public class List. Txt implements Filename. Filter{ public boolean accept(File dir, String name) { return name. ends. With(". txt"); } public static void main (String[] args) { File f = new File("d: \tmp"); Filename. Filter filter = new List. Txt(); String flist[] = f. list(filter); for (int i = 0; i < flist. length; i++) { System. out. println(flist[i]); } } }

4 Базовые классы потоков данных n n java. io. Input. Stream, java. io. Output. 4 Базовые классы потоков данных n n java. io. Input. Stream, java. io. Output. Stream – абстрактные методы ввода/вывода байтовых потоков, которые могут быть связаны с файлами, памятью, другими потоками и т. п. public abstract class Input. Stream : некоторые методы: public abstract int read() – чтение 1 байта с ожиданием; при EOF возвращает -1. ¨ public int read(byte[] b) – чтение в массив с ожиданием; возвращает число прочитанных байтов; при EOF возвращает -1, при отсутствии данных - 0. ¨ public long skip(long n) – пропуск n байтов. ¨ public void close(). ¨ n public abstract class Output. Stream : некоторые методы: public abstract void write(int b) – выводит в поток младший байт b. ¨ public void write(byte[] b) – выводит в поток все байты массива b. ¨ public void flush() – форсирует выдачу из буферов. ¨ public void close(). ¨ n n Методы могут генерировать исключения IOException. От этих абстрактных классов порождается сложная иерархия подклассов потоков ввода и вывода.

5 Некоторые подклассы потоков n public class File. Input. Stream, File. Output. Stream Служат 5 Некоторые подклассы потоков n public class File. Input. Stream, File. Output. Stream Служат для выполнения байт-ориентированных операций ввода/вывода с файлом. ¨ Конструкторы: по объекту File, по строке пути к файлу. ¨ Разделители пути зависят от используемой ОС. ¨ n public class Filter. Input. Stream, Filter. Output. Stream являются суперклассами для конкретных классов, обрабатывающих данные после ввода или перед выводом; ¨ конструируются на базе объектов Input. Stream, Output. Stream: конструктор Filter. Input. Stream(Input. Stream in) и аналогично для вывода. ¨ n public class Buffered. Input. Stream, Buffered. Output. Stream ¨ n подклассы Filter. . . Stream. Повышают эффективность работы с файлами за счет буферизации ввода/вывода public class Print. Stream ¨ подкласс Filter. Output. Stream. Содержит методы форматирования различных типов данных при выводе.

6 Пример: копирование файла n n Программа копирует файл, заданный первым параметром командной строки, 6 Пример: копирование файла n n Программа копирует файл, заданный первым параметром командной строки, в тот же каталог, присваивая копии имя, заданное вторым параметром. Методы работы с потоками могут возбуждать исключения ввода/вывода. Их следует хотя бы объявить в throws, а закрытие файлов вынести в finally. public class Copy. File { private static final int BUF_SIZE = 10000000; public static void main(String[] args) throws IOException { byte buf[] = new byte[BUF_SIZE]; File input. File = new File(args[0]); File output. File = new File(input. File. get. Parent(), args[1]); File. Input. Stream in = new File. Input. Stream(input. File); File. Output. Stream out = new File. Output. Stream(output. File); int c; try { while ((c = in. read(buf, 0, BUF_SIZE)) != -1) out. write(buf, 0, c); } finally { in. close(); out. close(); } } }

7 Классы java. io. Reader, java. io. Writer n n Отличаются от Input. Stream, 7 Классы java. io. Reader, java. io. Writer n n Отличаются от Input. Stream, Output. Stream тем, что ориентированы на ввод/вывод символов UNICODE, а не байтов, т. е. должны применяться при работе с текстовыми файлами. Например, для Input. Stream: abstract int read(); - возвращает один байт (0 -255 при удачном вводе, -1 если конец файла); ¨ int read(byte[] b, int off, int len); - читает байты в отрезок массива b, возвращает количество прочитанных байтов (-1 если конец файла). ¨ Для Reader: int read(); - возвращает один символ (-1 если конец файла); ¨ abstract int read(char[] cbuf, int off, int len); - читает символы в отрезок массива cbuf, возвращает количество прочитанных символов (-1 если конец файла). ¨ n Reader, Writer порождают иерархию классов, аналогичную иерархии Input. Stream, Output. Stream.

8 Стандартные ввод и вывод n System. in ¨ ¨ Стандартный поток ввода; Относится 8 Стандартные ввод и вывод n System. in ¨ ¨ Стандартный поток ввода; Относится к классу Input. Stream, поэтому организовать форматированный ввод не так просто, например: Input. Stream. Reader is = new Input. Stream. Reader(System. in); Buffered. Reader input = new Buffered. Reader(is); String name. Str = input. read. Line(); Класс Input. Stream. Reader преобразует поток байтов в поток символов; ¨ Класс Buffered. Reader организует буферизованный ввод, что позволяет вводить сразу строку символов. ¨ n System. out, System. err ¨ ¨ n Стандартные потоки вывода и ошибок; Относятся к классу Print. Stream, поэтому позволяют выводить что угодно с автоматическим преобразованием в строку. Имеются методы перенаправления стандартных потоков: set. In(Input. Stream in); ¨ set. Out(Print. Stream out), set. Err(Print. Stream err). ¨

9 Пример использования System. in, System. out import java. io. *; public class Console. 9 Пример использования System. in, System. out import java. io. *; public class Console. Input { public static void main(String[] args) throws IOException { Buffered. Reader data. In = new Buffered. Reader( new Input. Stream. Reader(System. in)); String name = ""; System. out. println("Введите ваше имя: "); name = data. In. read. Line(); System. out. println("Привет, " + name +"!"); } }

10 Произвольный доступ к файлам n public class java. io. Random. Access. File; Никак 10 Произвольный доступ к файлам n public class java. io. Random. Access. File; Никак не связан с иерархиями потоков данных; Служит для выполнения операций произвольного доступа к файлу; ¨ Конструкторы: ¨ ¨ n n n Random. Access. File(File file, String mode); Random. Access. File(String name, String mode); Параметр mode – один из режимов "r", "rwd", "rws". ¨ ¨ n r – только чтение; rw – чтение и запись; rwd – каждое изменение данных немедленно пишется на диск; rws – каждое изменение данных или метаданных немедленно пишется на диск. Некоторые методы: ¨ ¨ ¨ чтение и запись различных типов данных (read, read. Boolean, read. Char, read. Double, read. Byte и т. п. ); seek(long pos); get. File. Pointer(); length(); set. Length(long new. Length);

11 Ввод символов кириллицы n n Для внутреннего представления символов и строк в Java 11 Ввод символов кириллицы n n Для внутреннего представления символов и строк в Java используется двухбайтовая кодировка Unicode (UTF-16). Ввод текстов, содержащих символы кириллицы, и их преобразование в Unicode зависят от используемой кодировки символов. Может встретиться следующая: ANSI (Codepage 1251) – обычная кодировка кириллицы в Windows, используется при вводе с клавиатуры под Windows и в текстовых файлах; ¨ ASCII (Codepage 866) – кодировка DOS, может встретиться в старых текстовых файлах; ¨ Unicode – к сожалению, пока встречается редко. Такие текстовые файлы можно при желании получить с помощью, например, MS Word. ¨

12 Ввод символов кириллицы - 2 n Для ввода текста в ANSI-кодировке надо использовать 12 Ввод символов кириллицы - 2 n Для ввода текста в ANSI-кодировке надо использовать конструктор класса Input. Stream. Reader с параметром – кодовой страницей, например: ¨ ¨ n n для ввода с клавиатуры: Buffered. Reader br = new Buffered. Reader(new Input. Stream. Reader(System. in, "Cp 1251")); для ввода из файла: Buffered. Reader br = new Buffered. Reader(new Input. Stream. Reader(new File. Input. Stream("имя_файла"), "Cp 1251")); После этого метод br. read. Line() возвращает нормальную строку с правильными русскими буквами. Категорически не годится класс Random. Access. File. Его метод read. Line(), не обращая внимания ни на какие кодовые страницы, вводит однобайтовые символы и зверски преобразует их в Unicode путем добавления нулевого старшего байта. Это приемлемо только для текстов на латинском алфавите.

13 Параметризованные типы n n Другие названия в литературе: 13 Параметризованные типы n n Другие названия в литературе: "generics", "настраиваемые типы", "универсальные типы". Для работы с данными разных типов (например, для создания стека "чего угодно") можно обращаться к объектам класса Object. Но при этом возникают две проблемы: невозможно ограничить тип данных в конкретном случае (например, использовать стек только для int); ¨ для использования объектов нужно вручную выполнять приведение типов от Object к более конкретному. ¨ n n n Имеется возможность описывать классы, интерфейсы и методы, указывая в качестве параметра в угловых скобках тип данных. Это похоже на шаблоны в C++, но отличается по реализации. Информация о типе-параметре используется при компиляции Javaпрограммы (для проверок и приведения типов), но в компилированной программе вся эта информация стирается. Имеются ограничения на использование параметризованных типов, в частности: ¨ ¨ нельзя объявлять массивы настраиваемого типа; нельзя подставлять примитивные типы (int, double, …), но можно подставлять типы-обертки (Integer, Double, …).

14 Пример параметризованного класса n Описание класса: class Gen<T> { T obj; // Поле 14 Пример параметризованного класса n Описание класса: class Gen { T obj; // Поле - объект типа Т Gen(T obj) { // Конструктор this. obj = obj; } T get. Obj() { // Возвратить объект: return obj; } void show. Type() { // Показать тип Т: System. out. println("Type of T is " + obj. get. Class(). get. Name()); } } n Использование класса: class Generic { public static void main(String[] args) throws IOException { Gen int. Var = new Gen(100); Gen str. Var = new Gen("Hello!"); int. Var. show. Type(); System. out. println(int. Var. get. Obj()); str. Var. show. Type(); System. out. println(str. Var. get. Obj()); } }

15 Понятие контейнера n n Контейнер (или коллекция) – совокупность элементов-объектов, обеспечивающая как доступ 15 Понятие контейнера n n Контейнер (или коллекция) – совокупность элементов-объектов, обеспечивающая как доступ к отдельным элементам, так и выполнение определенных операций над контейнером в целом. Типы контейнеров могут различаться по разным признакам: ¨ ¨ ¨ n возможно ли добавление и удаление элементов после создания контейнера; имеется ли упорядоченность (нумерация) элементов; может ли один элемент дважды входить в контейнер; возможен ли быстрый доступ по номеру элемента или быстрый поиск по значению; и др. Массивы – простейший пример контейнера. Размер массива не изменяется после создания. ¨ Возможен быстрый доступ по номеру элемента. ¨ Вспомогательный класс java. util. Arrays содержит очень полезные методы для работы с массивами. ¨

16 Вспомогательный класс java. util. Arrays n n Содержит статические методы для копирования, сравнения, 16 Вспомогательный класс java. util. Arrays n n Содержит статические методы для копирования, сравнения, сортировки массивов, для быстрого (бинарного) поиска в сортированном массиве. Приведенные ниже методы (public static) перегружены для массивов всех примитивных типов. ¨ ¨ ¨ ¨ n int[] copy. Of(int[] arr, int new. Length) – копирование в новый массив; int[] copy. Of. Range(int[] arr, int from, int to) – копирование части массива; void fill(int[] arr, int value) – заполнение заданным значением; boolean equals(int[] arr 1, int[] arr 2) - сравнение содержимого двух массивов; String to. String(int[] arr) – преобразование в строку; void sort(int[] arr) – сортировка по возрастанию; int binary. Search(int[] arr, int key) – бинарный поиск в сортированном массиве. Пример: short[] my. Arr = {125, -15, 222, 221, 0, 1, -5, -10, 100, 98, 13, 98, 5}; Arrays. sort(my. Arr); short key = 98; int index = Arrays. binary. Search(my. Arr, key);

17 Интерфейс Comparable<T> n n Для сортировки и поиска в массивах произвольного типа необходимо 17 Интерфейс Comparable n n Для сортировки и поиска в массивах произвольного типа необходимо придать смысл сравнению двух элементов этого типа. Для этого класс элементов должен реализовать интерфейс Comparable, определяющий метод сравнения: ¨ int compare. To(T obj) – возвращает: n n отрицательное число при this < obj; 0 при this == obj; положительное число при this > obj. Тогда можно применять методы: public static void sort(Object[] a); ¨ public static int binary. Search(Object[] a, Object key); ¨ n Сравнение с помощью интерфейса Comparable называют "естественным" сравнением для данного класса. Если нужно использовать несколько разных вариантов сравнения для одного класса, следует создать объект, реализующий интерфейс Comparator (будет описан позднее).

18 Пример использования Comparable<T> class Full. Name implements Comparable<Full. Name> { String first, last; 18 Пример использования Comparable class Full. Name implements Comparable { String first, last; Full. Name(String first, String last) {this. first = first; this. last = last; } public int compare. To(Full. Name obj) { if ((this. last. compare. To(obj. last)) < 0 || (this. last. equals(obj. last)) && (this. first. compare. To(obj. first) < 0)) return -1; if ((this. last. compare. To(obj. last)) > 0 || (this. last. equals(obj. last)) && (this. first. compare. To(obj. first) > 0)) return 1; return 0; } } class Search. Objects { public static void main(String[] args) { Full. Name[] my. Arr = {new Full. Name("Сергей", "Дроздов"), new Full. Name("Анна", "Никифорова"), new Full. Name("Валерий", "Хашковский")}; Arrays. sort(my. Arr); Full. Name key = new Full. Name("Анна", "Никифорова"); int index = Arrays. binary. Search(my. Arr, key); System. out. println(index); } }

19 Простейшие контейнеры: Vector, Stack n Контейнеры, описанные на этом и следующем слайдах, не 19 Простейшие контейнеры: Vector, Stack n Контейнеры, описанные на этом и следующем слайдах, не рекомендуются к использованию как устаревшие. n Vector – массив с переменным числом элементов, увеличивающийся при необходимости. ¨ ¨ ¨ n Параметризованный вариант: Vector. Добавление элементов в конец или в заданную позицию. Доступ к элементу по индексу. Поиск элемента, проверка наличия элемента. Удаление элементов по индексу или по значению. Преобразование в массив и из массива. Stack, Stack - стек (подкласс Vector). Методы pop, push, empty, peek (проверка верхнего значения без удаления из стека), search (поиск элемента в стеке). ¨ При попытке извлечения из пустого стека выдает исключение Empty. Stack. Exception. ¨

20 Простейшие контейнеры: Bit. Set, Hashtable n Bit. Set – вектор из битов (множество), 20 Простейшие контейнеры: Bit. Set, Hashtable n Bit. Set – вектор из битов (множество), аналог паскалевского set of. булевские операции над множествами: and, or, xor, and. Not, intersects. ¨ операции над отдельными битами или группами битов: get, set, flip. ¨ Поиск следующего истинного или ложного бита: next. Set. Bit, next. Clear. Bit. ¨ n Hashtable - хеш-таблица (структура, предназначенная для быстрого поиска значения по ключу). ¨ Конструктор Hashtable(int initial. Capacity, float load. Factor); n initial. Capacity – размер таблицы; n load. Factor – коэффициент заполнения. Методы put, get, remove, contains. Key, contains. Value. ¨ Для хеширования используются методы hash. Code(), которые определены для каждого объекта Java. ¨ В случае, если заполненность таблицы превышает load. Factor, автоматически выполняется рехеширование (нежелательно медленная операция). ¨

21 Задания 1. Написать консольное приложение, которое читает строки текста из заданного файла (не 21 Задания 1. Написать консольное приложение, которое читает строки текста из заданного файла (не более 1000 строк), сортирует строки по убыванию длины и выводит результат в другой заданный файл. 2. Написать консольное приложение, которое читает целые числа из файла (по одному числу в строке, всего не более 500 чисел), выводит количество введенных чисел, сортирует числа по убыванию, а затем в цикле запрашивает у пользователя порядковый номер числа и выводит соответствующее число. Работа завершается, когда пользователь вводит -1.