Изучить предлагаемый теоретический материал; создать апплет, содержащий три кнопки, по нажатию на которые создаются экземпляры классов Rect, ColoredRect, DrawableRect (реализованные в лабораторной работе №2). Созданные экземпляры помещаются в один массив с типом класса родителя Rect. Реализовать метод захвата мышкой и перемещения по апплету любого прямоугольника, отображенного в окне. Полученный результат должен функционировать следующим образом (Move_Rect/Dif_Rect)
Содержание отчета
1. цель работы;
2. введение;
3. программно-аппаратные средства, используемые при выполнении работы;
4. основную часть (описание самой работы), выполненную согласно требованиям к результатам выполнения лабораторного практикума;
5. заключение (описание результатов и выводы);
6. список используемой литературы.
Список рекомендуемой литературы
1. Шилдт, Герберт Java 8. Руководство для начинающих / Герберт Шилдт. - М.: Вильямс, 2015. - 720 c.
2. Гарнаев, Андрей WEB-программирование на Java и JavaScript / Андрей Гарнаев, Сергей Гарнаев. - Москва: СПб. [и др.]: Питер, 2017. - 718 c.
3. Гонсалвес, Энтони Изучаем Java EE 7 / Энтони Гонсалвес. - М.: Питер, 2016. - 640 c.
4. Гупта, Арун Java EE 7. Основы / Арун Гупта. - М.: Вильямс, 2014. - 336 c.
5. Савитч, Уолтер Язык Java. Курс программирования / Уолтер Савитч. - М.: Вильямс, 2015. - 928 c.
ЛАБОРАТОРНАЯ РАБОТА №5
Тема: пакет java.io, сериализация объектов
Цель: Целью работы является ознакомление со средствами стандартного пакета языка Java java.io для успешного выполнения операций ввода-вывода из создаваемых программ, а также приобретение практических навыков работы при обмене данными через файл и консоль.
Методические указания к выполнению работы
Поток данных
Java для описания работы по вводу/выводу используется специальное понятие поток данных (stream). Поток данных связан с некоторым источником или приемником данных, способных получать или предоставлять информацию. Соответственно, потоки делятся на входные - читающие данные, и на выходные - передающие (записывающие) данные. Введение концепции stream позволяет отделить программу, обменивающуюся информацией одинаковым образом с любыми устройствами, от низкоуровневых операций с такими устройствами ввода/вывода.
В Java потоки естественным образом представляются объектами. Описывающие их классы как раз и составляют основную часть пакета java.io. Они довольно разнообразны и отвечают за различную функциональность. Все классы разделены на две части - одни осуществляют ввод данных, другие вывод.
Минимальной "порцией" информации является бит, принимающий значение 0 или 1. Традиционно используется более крупная единица измерения байт, объединяющая 8 бит. Таким образом, значение, представленное 1 байтом, находится в диапазоне от 0 до 28-1=255, или, если использовать знак, от -128 до +127. Примитивный тип byte в Java в точности соответствует последнему, знаковому диапазону.
Базовые, наиболее универсальные классы позволяют считывать и записывать информацию именно в виде набора байт. Чтобы их было удобно применять в различных задачах, java.io содержит также классы, преобразующие любые данные в набор байт. Например, если нужно сохранить результаты вычислений - набор значений типа double - в файл, то их можно сначала легко превратить в набор байт, а затем эти байты записать файл. Аналогичные действия совершаются и в ситуации, когда требуется сохранить объект (т.е. его состояние) - преобразование в набор байт и последующая их запись в файл. Понятно, что при восстановлении данных в обоих рассмотренных случаях проделываются обратные действия - сначала считывается последовательность байт, а затем она преобразовывается в нужный формат.
Байтовые потоки
Байтовые потоки определяются в двух иерархиях классов. Наверху этой иерархии – два абстрактных класса: Inputstream и Outputstream (рисунок 1). Каждый из этих абстрактных классов имеет несколько конкретных подклассов, которые обрабатывают различия между разными устройствами, такими как дисковые файлы, сетевые соединения и даже буферы памяти.
Абстрактные классы Inputstream и Outputstream определяют несколько ключевых методов, которые реализуются другими поточными классами. Два наиболее важных— read() и write(), которые, соответственно, читают и записывают байты данных. Оба метода объявлены как абстрактные внутри классов inputstream и outputstream и переопределяются производными поточными классами.
InputStream - это базовый класс для потоков ввода, т.е. чтения. Соответственно, он описывает базовые методы для работы с байтовыми потоками данных. Эти методы необходимы всем классам, наследующимся от InputStream:
Метод int read() – абстрактный. Считывает один байт из потока. Если чтение успешно, то значение между 0..255 представляет собой полученный байт, если конец потока, то значение равно –1.
Метод int read(byte[] b) возвращает количество считанных байт и сохраняет их в массив b. Метод так же абстрактный.
Метод read(byte[] b, int offset, int length) считывает в массив b начиная с позиции offset length символов.
Метод int available() возвращает количество байт, на данный момент готовых к чтению из потока. Этот метод применяют, что бы операции чтения не приводили к зависанию, когда данные не готовы к считыванию.
Метод close() заканчивает работу с потоком.
классе OutputStream, аналогичным образом, определяются три метода
write() – один принимающий в качестве параметра int, второй byte[], и третий
byte[], плюс два int-числа. Все эти методы возвращают void:
Метод void write(int i) пишет только старшие 8 бит, остальные игнорирует.
Метод void write(byte[] b) записывает массив в поток.
Метод void write(byte[] b, int offset, int length) записывает length-элементов из массива байт в поток, начиная с элемента offset.
Метод flush() используется для очистки буфера и записи данных.