Часть 1. Введение
Тем: 4
Тема 1. Ввод-вывод
Содержание
- Потоки ввода-вывода
- Четыре вида потоков
- Операции с потоками
- Исключения ввода-вывода
- Файловый ввод-вывод и преобразование потоков
- Классы файловых потоков
- Кодировки и преобразование потоков
- Фильтрующие потоки
- Фильтрация
- Буферизация
- Дополнительные возможности потоков
- Эмуляция чтения и записи
- Конкатенация потоков ввода
- Подавление ошибок
- Расширенный ввод-вывод
- Платформонезависимый ввод-вывод
- Файлы с произвольным доступом
- Классы System и Console
- Дескрипторы файлов
- Файлы, каталоги, пути и разделители
- Операции с отдельными файлами
- Листинг каталогов
- Ввод-вывод в Java 7
- Файловые системы и пути
- Операции с отдельными файлами
- Листинг каталогов
- Ввод-вывод и исключения
- Идиома работы с ресурсами
- Работа с несколькими потоками
Примеры
zipДомашнее задание 1. Обход файлов
-
Разработайте класс
Walk
, осуществляющий подсчет хэш-сумм файлов.-
Формат запуска:
java Walk <входной файл> <выходной файл>
- Входной файл содержит список файлов, которые требуется обойти.
-
Выходной файл должен содержать по одной строке для каждого файла.
Формат строки:
<шестнадцатеричная хэш-сумма> <путь к файлу>
- Для подсчета хэш-суммы используйте алгоритм Дженкинса.
- Если при чтении файла возникают ошибки, укажите в качестве его хэш-суммы все нули.
- Кодировка входного и выходного файлов — UTF-8.
- Размеры файлов могут превышать размер оперативной памяти.
-
Пример
Входной файл samples/1 samples/12 samples/123 samples/1234 samples/1 samples/binary samples/no-such-file
Выходной файл 806b80c9 samples/1 7401b0b6 samples/12 29b8dfb0 samples/123 ad414afe samples/1234 806b80c9 samples/1 ef2a46bd samples/binary 00000000 samples/no-such-file
-
Формат запуска:
-
Сложный вариант:
-
Разработайте класс
RecursiveWalk
, осуществляющий подсчет хэш-сумм файлов в директориях. - Входной файл содержит список файлов и директорий, которые требуется обойти. Обход директорий осуществляется рекурсивно.
-
Пример:
Входной файл samples/binary samples samples/no-such-file
Выходной файл ef2a46bd samples/binary 806b80c9 samples/1 7401b0b6 samples/12 29b8dfb0 samples/123 ad414afe samples/1234 ef2a46bd samples/binary 00000000 samples/such-file
-
Разработайте класс
-
При выполнении задания следует обратить внимание на:
- Дизайн и обработку исключений, диагностику ошибок.
- Программа должна корректно завершаться даже в случае ошибки.
- Корректная работа с вводом-выводом.
- Отсутствие утечки ресурсов.
- Возможность повторного использования кода.
-
Требования к оформлению задания.
- Проверяется исходный код задания.
-
Весь код должен находиться в пакете
info.kgeorgiy.ja.фамилия.walk
.
Тема 2. Collections Framework
Содержание
- Контейнеры
- Коллекции
- Интерфейс Collection
- Итераторы
- Класс AbstractCollection
- Множества
- Интерфейс Set
- Методы equals и hashCode
- Реализации множеств и базовые классы
- Списки
- Интерфейс List
- Итераторы по спискам
- Реализации списков и базовые классы
- Очереди и деки
- Интерфейс Queue
- Интерфейс Dequeue
- Реализации очередей и деков, базовые классы
- Коллекции
- Отображения
- Интерфейс Map
- Пары и проекции отображений
- Реализации отображений и базовые классы
- Упорядоченные коллекции
- Сравнение элементов и согласованность с equals
- Упорядоченные множества
- Упорядоченные отображения
- Очередь с приоритетами
- Алгоритмы
- Класс Collections
- Класс Arrays
- Устаревшие коллекции
Примеры
zipДомашнее задание 2. Множество на массиве
-
Разработайте класс
ArraySet
, реализующий неизменяемое упорядоченное множество.-
Класс
ArraySet
должен реализовывать интерфейс SortedSet (простой вариант) или NavigableSet (сложный вариант). - Все операции над множествами должны производиться с наилучшей асимптотической эффективностью.
-
Класс
-
При выполнении задания следует обратить внимание на:
- Применение стандартных коллекций.
- Избавление от повторяющегося кода.
- Отсутствие Unchecked warnings при компиляции.
- Отсутствие излишних подавленных unchecked warnings.
Тема 3. Лямбда-выражения и потоки
Содержание
- Расширения интерфейсов
- Лямбда-выражения
- Функциональные интерфейсы
- Лямбда-выражения
- Ссылки на методы
- Поддержка лямбда-выражений в основных классах
- Типы-обертки
- Класс Objects
- Стандартные функциональные интерфейсы
- Поддержка лямбда-выражений в Collections Framework
- Необязательные значения
- Компараторы
- Новые методы коллекций и отображений
- Потоки значений
- Применение
- Типы потоков
- Создание и преобразование потоков
- Комбинаторы
- Стандартные коллекторы
- Реализация потоков
- Разбиваемые итераторы
- Обобщенные свертки
- Параллельное исполнение
- Применение
Примеры
zipДомашнее задание 3. Студенты
-
Разработайте класс
StudentDB
, осуществляющий поиск по базе данных студентов.-
Класс
StudentDB
должен реализовывать интерфейсStudentQuery
(простой вариант) илиGroupQuery
(сложный вариант). - Каждый метод должен состоять из ровно одного оператора. При этом длинные операторы надо разбивать на несколько строк.
-
Класс
-
При выполнении задания следует обратить внимание на:
- применение лямбда-выражений и потоков;
- избавление от повторяющегося кода.
Тема 4. Reflection
Содержание
- Введение в Reflection
- Идентификаторы типов (type tokens)
- Информация о типе
- Структура класса
- Поля
- Получение информации
- Чтение и запись значений
- Методы и конструкторы
- Получение информации
- Вызов методов
- Создание объектов
- Вложенные классы
- Поля
- Массивы
- Загрузка классов
- Загрузчики классов
- Иерархия загрузчиков
- Доступ к ресурсам
- Параметры типов
- Интерфейс Type и его потомки
- Generic-массивы
- Посредники
- Создание посредников
- Обработчики вызовов
- Применение посредников
Примеры
zipДомашнее задание 4. Implementor
-
Реализуйте класс
Implementor
, генерирующий реализации классов и интерфейсов.- Аргумент командной строки: полное имя класса/интерфейса, для которого требуется сгенерировать реализацию.
-
В результате работы должен быть сгенерирован java-код класса с суффиксом
Impl
, расширяющий (реализующий) указанный класс (интерфейс). - Сгенерированный класс должен компилироваться без ошибок.
- Сгенерированный класс не должен быть абстрактным.
- Методы сгенерированного класса должны игнорировать свои аргументы и возвращать значения по умолчанию.
-
В задании выделяются три варианта:
- Простой —
Implementor
должен уметь реализовывать только интерфейсы (но не классы). Поддержка generics не требуется. - Сложный —
Implementor
должен уметь реализовывать и классы, и интерфейсы. Поддержка generics не требуется. - Бонусный —
Implementor
должен уметь реализовывать generic-классы и интерфейсы. Сгенерированный код должен иметь корректные параметры типов и не порождатьUncheckedWarning
.
- Простой —
Библиография
- Forman I.R., Forman N. Java Reflection in Action
- Reflection (guide)
- The Reflection API (tutorial)
Часть 2. Инструменты
Тем: 3
Тема 5. Jar
Содержание
- Jar-файлы
- Инструмент командной строки
- API для работы с Zip, Jar и Gzip
- Манифесты
- Формат
- Основные атрибуты
Домашнее задание 5. Jar Implementor
Это домашнее задание связано с предыдущим и будет приниматься только с ним. Предыдущее домашнее задание отдельно сдать будет нельзя.
-
Создайте
.jar
-файл, содержащий скомпилированныйImplementor
и сопутствующие классы.-
Созданный
.jar
-файл должен запускаться командойjava -jar
. -
Запускаемый
.jar
-файл должен принимать те же аргументы командной строки, что и классImplementor
.
-
Созданный
-
Модифицируйте
Implementor
так, чтобы при запуске с аргументами-jar имя-класса файл.jar
он генерировал.jar
-файл с реализацией соответствующего класса (интерфейса). - Вы можете создавать файлы и директории в текущем каталоге, но не за его пределами.
-
Для проверки, кроме исходного кода так же должны быть представлены:
-
скрипт для создания запускаемого
.jar
-файла, в том числе исходный код манифеста; -
запускаемый
.jar
-файл.
-
скрипт для создания запускаемого
- Сложный вариант. Решение должно быть модуляризовано.
Тема 6. Javadoc
Содержание
- Что такое Javadoc
- Структура Javadoc
- Javadoc-комментарии
- Типы тегов
- Блочные теги
- Общие теги
- Теги методов
- Строчные теги
- Ссылки
- Код и значения
- Применение Javadoc
- Объекты документирования
- Наследование Javadoc
- Компиляция Javadoc
Примеры
zipДомашнее задание 6. Javadoc
Это домашнее задание связано с двумя предыдущими и будет приниматься только с ними. Предыдущие домашнее задание отдельно сдать будет нельзя.
-
Документируйте класс
Implementor
и сопутствующие классы с применением Javadoc.-
Должны быть документированы все классы и все члены классов,
в том числе
private
. - Документация должна генерироваться без предупреждений.
-
Сгенерированная документация должна содержать корректные
ссылки на классы стандартной библиотеки и модуля
info.kgeorgiy.java.advanced.implementor
.
-
Должны быть документированы все классы и все члены классов,
в том числе
-
Для проверки, кроме исходного кода так же должны быть представлены:
- скрипт для генерации документации;
- сгенерированная документация.
Тема 7. Модули
Содержание
- Что такое модули
- Определение
- Объявление
- Module path
- Управление зависимостями
- Подключение зависимостей
- Экспорт пакетов
- Открытие пакетов
- Сервисы
- Определение сервиса
- Реализация сервиса и ее объявление
- Объявление использования сервиса
- Загрузка сервисов
- Модуляризованный JDK
Примеры
zipЧасть 3. Многопоточное программирование
Тем: 4
Тема 8. Введение в многопоточное программирование
Содержание
- Параллельное исполнение
- Развитие параллельных систем
- Потоки и процессы
- Типы параллелизма
- Итеративный
- Рекурсивный
- Обмен сообщениями
- Неделимые операции
- Безусловные
- Условные
- Свойства планировщика
- Потоки
- Создание потоков
- Состояния и свойства потоков
- Завершение потоков
- Механизм прерывания
Примеры
zipДомашнее задание 7. Итеративный параллелизм
-
Реализуйте класс
IterativeParallelism
, который будет обрабатывать списки в несколько потоков. -
В простом варианте должны быть реализованы следующие методы:
minimum(threads, list, comparator)
— первый минимум;maximum(threads, list, comparator)
— первый максимум;all(threads, list, predicate)
— проверка, что все элементы списка, удовлетворяют предикату;any(threads, list, predicate)
— проверка, что существует элемент списка, удовлетворяющий предикату.count(threads, list, predicate)
— подсчёт числа элементов списка, удовлетворяющих предикату.
-
В сложном варианте должны быть дополнительно реализованы следующие методы:
filter(threads, list, predicate)
— вернуть список, содержащий элементы удовлетворяющие предикату;map(threads, list, function)
— вернуть список, содержащий результаты применения функции;join(threads, list)
— конкатенация строковых представлений элементов списка.
-
Во все функции передается параметр
threads
— сколько потоков надо использовать при вычислении. Вы можете рассчитывать, что число потоков относительно мало. - Не следует рассчитывать на то, что переданные компараторы, предикаты и функции работают быстро.
- При выполнении задания нельзя использовать Concurrency Utilities и Parallel Streams.
Библиография
- Java Language Specification. Theads and locks
- Concurrency (Java Tutorial)
- Lea D. Concurrent Programming in Java
- Goetz B. Java Concurrency in Practice
- Garg V. Concurrent and Distributed Computing in Java
Тема 9. Взаимодействие потоков
Содержание
- Синхронизация и блокировки
- Синхронизация
- Неявные блокировки
- Активное ожидания
- Мониторы и условия
- Мониторы
- Условия и работа с ними
- Пассивное ожидание
- Внезапные пробуждения
- Модель памяти Java
- Атомарность операций
- Видимость изменений и барьеры
- Упорядоченность изменений
- Volatile-переменные
- Примеры многопоточных программ
- Двусторонний барьер
- Гарантированный тупик
- Уровни безопасности
- Неизменяемые объекты
- Потокобезопасные объекты
- Потоконебезопасные объекты
- Thread-local objects
Примеры
zipДомашнее задание 8. Параллельный запуск
-
Напишите класс
ParallelMapperImpl
, реализующий интерфейсParallelMapper
.public interface ParallelMapper extends AutoCloseable { <T, R> List<R> map( Function<? super T, ? extends R> f, List<? extends T> args ) throws InterruptedException; @Override void close(); }
-
Метод
map
должен параллельно вычислять функциюf
на каждом из указанных аргументов (args
). -
Метод
close
должен останавливать все рабочие потоки. -
Конструктор
ParallelMapperImpl(int threads)
создаетthreads
рабочих потоков, которые должны быть использованы для распараллеливания. -
К одному
ParallelMapperImpl
могут одновременно обращаться несколько клиентов. - Задания на исполнение должны накапливаться в очереди и обрабатываться в порядке поступления.
- В реализации не должно быть активных ожиданий.
-
Метод
-
Доработайте класс
IterativeParallelism
так, чтобы он мог использоватьParallelMapper
.-
Добавьте конструктор
IterativeParallelism(ParallelMapper)
. -
Методы класса должны делить работу на
threads
фрагментов и исполнять их при помощиParallelMapper
. -
При наличии
ParallelMapper
самIterativeParallelism
новые потоки создавать не должен. -
Должна быть возможность одновременного запуска и работы
нескольких клиентов, использующих один
ParallelMapper
.
-
Добавьте конструктор
- При выполнении задания всё ещё нельзя использовать Concurrency Utilities и Parallel Streams.
Библиография
- Java Language Specification. Theads and locks
- Concurrency (Java Tutorial)
- Lea D. Concurrent Programming in Java
- Goetz B. Java Concurrency in Practice
- Garg V. Concurrent and Distributed Computing in Java
Тема 10. Задачи и средства многопоточного программирования
Содержание
- Классические задачи многопоточного программирования
- Доступ к разделяемому ресурсу
- Производители и потребители
- Читатели и писатели
- Обедающие философы
- Задания и работники
- Атомарные операции
- Виды атомарных операций
- CompareAndSet
- Применение атомарных операций
- Помеченные ссылки
- Блокировки и условия
- Блокировки
- Условия
- Блокировки чтения-записи
- Примитивы синхронизации
- Критические секции
- Семафоры
- Барьеры
- Защелки
- Рандеву
- Мониторы
- Решение классических задач многопоточного программирования
- Читатели и писатели
- Обедающие философы
- Задания и работники
Библиография
- Java Concurrency Utilities
- High Level Concurrency Objects (Java Tutorial)
- JSR 166: Concurrency Utilities
- Concurrent Programming with J2SE 5.0
- Эндрюс Г. Основы многопоточного, параллельного и распределенного программирования
- Goetz B. Java concurrency in practice
Тема 11. Concurrency Utilities
Содержание
- Многопоточные коллекции
- Блокирующиеся очереди
- Многопоточные отображения
- Самокопирующиеся коллекции
- Управление заданиями
- Исполнители
- Функции и результаты
- Отложенное исполнение
- Прочие возможности
- Интервалы времени
- Очереди с задержкой
Домашнее задание 9. Web Crawler
-
Напишите потокобезопасный класс
WebCrawler
, который будет рекурсивно обходить сайты.-
Класс
WebCrawler
должен иметь конструкторpublic WebCrawler(Downloader downloader, int downloaders, int extractors, int perHost)
downloader
позволяет скачивать страницы и извлекать из них ссылки;downloaders
— максимальное число одновременно загружаемых страниц;extractors
— максимальное число страниц, из которых одновременно извлекаются ссылки;perHost
— максимальное число страниц, одновременно загружаемых c одного хоста. Для определения хоста следует использовать методgetHost
классаURLUtils
из тестов.
-
Класс
WebCrawler
должен реализовывать интерфейсCrawler
public interface Crawler extends AutoCloseable { Result download(String url, int depth); void close(); }
-
Метод
download
должен рекурсивно обходить страницы, начиная с указанного URL, на указанную глубину и возвращать список загруженных страниц и файлов. Например, если глубина равна 1, то должна быть загружена только указанная страница. Если глубина равна 2, то указанная страница и те страницы и файлы, на которые она ссылается, и так далее. -
Метод
download
может вызываться параллельно в нескольких потоках. - Загрузка и обработка страниц (извлечение ссылок) должна выполняться максимально параллельно, с учетом ограничений на число одновременно загружаемых страниц (в том числе с одного хоста) и страниц, с которых загружаются ссылки.
-
Для распараллеливания разрешается создать
до
downloaders + extractors
вспомогательных потоков. -
Повторно загружать и/или извлекать ссылки из одной
и той же страницы в рамках одного обхода
(
download
) запрещается. -
Метод
close
должен завершать все вспомогательные потоки.
-
Метод
-
Для загрузки страниц должен применяться
Downloader
, передаваемый первым аргументом конструктора.public interface Downloader { public Document download(final String url) throws IOException; }
-
Метод
download
загружает документ по его адресу (URL). -
Документ позволяет получить ссылки по загруженной странице:
public interface Document { List<String> extractLinks() throws IOException; }
Ссылки, возвращаемые документом, являются абсолютными и имеют схемуhttp
илиhttps
.
-
Метод
-
Должен быть реализован метод
main
, позволяющий запустить обход из командной строки-
Командная строка
WebCrawler url [depth [downloads [extractors [perHost]]]]
-
Для загрузки страниц требуется использовать реализацию
CachingDownloader
из тестов.
-
Командная строка
-
Класс
-
Версии задания
- Простая — не требуется учитывать ограничения
на число одновременных закачек с одного хоста
(
perHost >= downloaders
). - Полная — требуется учитывать все ограничения.
- Бонусная — сделать параллельный обход в ширину.
- Простая — не требуется учитывать ограничения
на число одновременных закачек с одного хоста
(
- Задание подразумевает активное использование Concurrency Utilities, в частности, в решении не должно быть «велосипедов», аналогичных/легко сводящихся к классам из Concurrency Utilities.
Библиография
- JSR 166: Concurrency Utilities
- Concurrent Programming with J2SE 5.0
- Getting to know synchronizers
- Эндрюс Г. Основы многопоточного, параллельного и распределенного программирования
- Goetz B. Java concurrency in practice
Часть 4. Сетевые приложения
Тем: 3
Тема 12. Работа с сетью
Содержание
- Введение
- Стек сетевых протоколов
- Протоколы IPv4 и IPv6
- Протокол TCP
- Протокол UDP
- DNS
- Адреса
- Адреса хостов
- Работа с DNS
- Адреса портов
- Работа с TCP
- Клиентский сокет
- Создание
- Управление ресурсами
- Закрытие части соединения
- Серверный сокет
- Создание
- Прием соединений
- Клиентский сокет
- Работа с UDP
- Датаграммы
- Исходящие
- Входящие
- Сокеты
- Создание
- Отправка и прием данных
- Датаграммы
- URI и URL
- URI
- Понятие об URI
- Структура URI
- Сравнение URI
- URL
- Понятие об URL
- Структура URL
- Сравнение URL
- URI
- Соединения
- Создание соединения
- Жизненный цикл соединения
- Быстрое установление соединения
- Поддержка протоколов
- Работа с HTTP
- Клиент
- Сервер
Примеры
zipДомашнее задание 10. HelloUDP
- Реализуйте клиент и сервер, взаимодействующие по UDP.
-
Класс HelloUDPClient должен отправлять запросы
на сервер, принимать результаты и выводить их на консоль.
-
Аргументы командной строки:
- имя или ip-адрес компьютера, на котором запущен сервер;
- номер порта, на который отсылать запросы;
- префикс запросов (строка);
- число параллельных потоков запросов;
- число запросов в каждом потоке.
- Запросы должны одновременно отсылаться в указанном числе потоков. Каждый поток должен ожидать обработки своего запроса и выводить сам запрос и результат его обработки на консоль. Если запрос не был обработан, требуется послать его заново.
- Запросы должны формироваться по схеме <префикс запросов><номер потока>_<номер запроса в потоке>.
-
Аргументы командной строки:
-
Класс HelloUDPServer должен принимать задания, отсылаемые
классом HelloUDPClient и отвечать на них.
-
Аргументы командной строки:
- номер порта, по которому будут приниматься запросы;
- число рабочих потоков, которые будут обрабатывать запросы.
- Ответом на запрос должно быть Hello, <текст запроса>.
- Несмотря на то, что текущий способ получения ответа по запросу очень прост, сервер должен быть рассчитан на ситуацию, когда этот процесс может требовать много ресурсов и времени.
- Если сервер не успевает обрабатывать запросы, прием запросов может быть временно приостановлен.
-
Аргументы командной строки:
Тема 13. Сериализация и RMI
Содержание
- Сериализация
- Сериализация и десериализация
- Объектные потоки
- Автоматическая сериализация
- Ручная сериализация
- Настраиваемая сериализация
- Сериализация и версионирование
- Сериализация и дескрипторы
- Концепции RMI
- Предназначение
- Схема работы и стек протоколов
- Удаленные интерфейсы
- Stub и Skeleton
- Распределенная сборка мусора
- RMI Registry
- Применение RMI
Примеры
zipДомашнее задание 11. Физические лица
-
Добавьте к банковскому приложению возможность работы с физическими
лицами.
-
У физического лица (
Person
) можно запросить имя, фамилию и номер паспорта. -
Удалённые физические лица (
RemotePerson
) должны передаваться при помощи удалённых объектов. -
Локальные физические лица (
LocalPerson
) должны передаваться при помощи механизма сериализации, и при последующем использовании не требовать связи с сервером. - Должна быть возможность поиска физического лица по номеру паспорта, с выбором типа возвращаемого лица.
- Должна быть возможность создания записи о физическом лице по его данным.
-
У физического лица может быть несколько счетов,
к которым должен предоставляться доступ
(через
Person
). - Счёту физического лица с идентификатором subId должен соответствовать банковский счёт с id вида passport:subId.
-
Изменения, производимые со счётом в банке
(создание и изменение баланса), должны быть видны всем
соответствующим
RemotePerson
, и только темLocalPerson
, которые были созданы после этого изменения. -
Изменения в счетах, производимые через
RemotePerson
, должны сразу применяться глобально, а производимые черезLocalPerson
– только локально для этого конкретногоLocalPerson
.
-
У физического лица (
-
Реализуйте приложение, демонстрирующее работу с физическим лицами.
- Аргументы командной строки: имя, фамилия, номер паспорта физического лица, номер счёта, изменение суммы счёта.
- Если информация об указанном физическом лице отсутствует, то оно должно быть добавлено. В противном случае – должны быть проверены его данные.
- Если у физического лица отсутствует счёт с указанным номером, то он создается с нулевым балансом.
- После обновления суммы счёта новый баланс должен выводиться на консоль.
-
Напишите тесты, проверяющие вышеуказанное поведение как банка, так и приложения.
- Для реализации тестов рекомендуется использовать JUnit (Tutorial). Множество примеров использования можно найти в тестах.
- Если вы знакомы с другим тестовым фреймворком (например, TestNG), то можете использовать его.
-
Добавьте jar-файлы используемых библиотек в каталог
lib
вашего репозитория. - Нельзя использовать самописные фреймворки и тесты,
запускаемые через
main
.
- Сложный вариант
- На каждом счету всегда должно быть неотрицательное количество денег.
- Тесты не должны рассчитывать на наличие запущенного RMI Registry.
-
Создайте класс
BankTests
, запускающий тесты. -
Создайте скрипт, запускающий
BankTests
и возвращающий код (статус)0
в случае успеха и1
в случае неудачи. - Создайте скрипт, запускающий тесты с использованием стандартного подхода для вашего тестового фреймворка. Код возврата должен быть как в предыдущем пункте.
-
Приложения и тесты должны находится в пакете
info.kgeorgiy.ja.*.bank
и его подпакетах.
Тема 14. Неблокирующий и асинхронный ввод-вывод
Содержание
- Буферы
- Операции
- Чтение и запись
- Байтовые буферы
- Типизированные буферы
- Каналы
- Иерархия каналов
- Байтовые каналы
- Файловые каналы
- Файлы отображаемые в память
- Блокировки
- Сетевые каналы
- Неблокирующий ввод-вывод
- Асинхронные каналы
Примеры
zipДомашнее задание 12. HelloNonblockingUDP
- Реализуйте клиент и сервер, взаимодействующие по UDP, используя только неблокирующий ввод-вывод.
-
Класс
HelloUDPNonblockingClient
должен иметь функциональность аналогичнуюHelloUDPClient
, но без создания новых потоков. -
Класс
HelloUDPNonblockingServer
должен иметь функциональность аналогичнуюHelloUDPServer
, но все операции с сокетом должны производиться в одном потоке. -
В реализации не должно быть активных ожиданий,
в том числе через
Selector
. - Обратите внимание на выделение общего кода старой и новой реализации.
- Бонусный вариант. Клиент и сервер могут перед началом работы выделить O(число рабочих потоков) памяти. Выделять дополнительную память во время работы запрещено.
Часть 5. Разное
Тем: 2
Тема 15. Интернационализация и локализация
Содержание
- Локали
- Локализация данных
- Создание ResourceBundle
- Загрузка ResourceBundle
- Использование ResourceBundle
- Форматирование
- Форматирование чисел
- Форматирование дат и времени
- Форматирование сообщений
- Работа с текстом
- Сравнение строк
- Разбиение текста
- Запись текста
Примеры
zipДомашнее задание 13. Статистика текста
-
Создайте приложение
TextStatistics
, анализирующее тексты на различных языках.-
Аргументы командной строки:
- локаль текста,
- локаль вывода,
- файл с текстом,
- файл отчета.
- Поддерживаемые локали текста: все локали, имеющиеся в системе.
- Поддерживаемые локали вывода: русская и английская.
- Файлы имеют кодировку UTF-8.
-
Подсчет статистики должен вестись по следующим категориям:
- предложения,
- слова,
- числа,
- деньги,
- даты.
-
Для каждой категории должна собираться следующая статистика:
- число вхождений,
- число различных значений,
- минимальное значение,
- максимальное значение,
- минимальная длина,
- максимальная длина,
- среднее значение/длина.
-
Пример отчета:
Анализируемый файл "input.txt". Сводная статистика Число предложений: 30. Число слов: 117. Число чисел: 37. Число сумм: 3. Число дат: 3. Статистика по предложениям Число предложений: 30 (30 различных). Минимальное предложение: "Анализируемый файл "input.txt".". Максимальное предложение: "Число чисел: 37.". Минимальная длина предложения: 13 ("Число дат: 3."). Максимальная длина предложения: 109 ("GK: если сюда поставить реальное предложение, то процесс не сойдётся"). Средняя длина предложения: 37,333. Статистика по словам Число слов: 117 (48 различных). Минимальное слово: "GK". Максимальное слово: "языках". Минимальная длина слова: 1 ("с"). Максимальная длина слова: 15 ("стабилизировать"). Средняя длина слова: 6,641. Статистика по числам Число чисел: 37 (22 различных). Минимальное число: -12345,67. Максимальное число: 12345,67. Среднее число: 208,847. Статистика по суммам денег Число сумм: 3 (3 различных). Минимальная сумма: 100,00 ₽. Максимальная сумма: 345,67 ₽. Средняя сумма: 222,83 ₽. Статистика по датам Число дат: 3 (3 различных). Минимальная дата: 17 мая 2024 г.. Максимальная дата: 30 мая 2024 г.. Средняя дата: 23 мая 2024 г..
-
Аргументы командной строки:
- Вы можете рассчитывать на то, что весь текст помещается в память.
-
При выполнении задания следует обратить внимание на:
- Декомпозицию сообщений для локализации.
- Согласование сообщений по роду и числу.
- Напишите тесты, проверяющие вышеуказанное поведение приложения.
-
Приложение и тесты должны находится в пакете
info.kgeorgiy.ja.*.i18n
и его подпакетах.
Тема 16. Сборка мусора
Содержание
- Сборка мусора
- Сжимающие и копирующие сборщики
- Гипотеза о поколениях и ее применение
- Ссылки
- Типы ссылок
- Очереди ссылок
Примеры
zipЧасть 6. Интерфейс пользователя
Тем: 4
Тема 17. Стандартные компоненты
Примеры
zipТема 18. Обработка событий
Примеры
zipТема 19. Модели
Примеры
zipТема 20. JavaBeans
Часть 7. XML
Тем: 5