
- •Амурский государственный университет Факультет математики и информатики
- •Допущено учебно-методическим объединением (умо) вузов
- •Методические указания к лабораторной работе
- •1. Простейшее приложение Hello
- •2. Структура Java-программы
- •2.1 Переменные
- •2.1.1 Примитивные типы
- •2.1.2 Ссылочные типы
- •2.2 Методы
- •2.3 Классы
- •2.3.1 Статические и динамические элементы (модификатор static)
- •2.3.2 Модификаторы доступа
- •2.3.3 Наследование классов
- •2.3.4 Специальные переменные
- •2.4 Пакеты и импортирование
- •2.4.1 Использование пакетов
- •2.4.2 Создание пакетов
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Простейший апплет Hello
- •1.1 Апплет Неllo, управляемый мышью
- •2. Простейший апплет HelloApplet, созданный Java Applet Wizard
- •2.1 Создание шаблона апплета HelloApplet
- •2.2 Исходные файлы апплета HelloApplet
- •2.3 Упрощенный вариант исходного текста апплета HelloApplet
- •3. Аргументы апплета
- •3.1 Передача параметров апплету
- •3.2 Апплет, принимающий параметры
- •3.4 Двойная буферизация графического изображения
- •4. События и их обработка
- •4.1 Обработчики событий от мыши и клавиатуры
- •4.2 Обработка событий
- •4.3 Апплет, обрабатывающий события
- •4.4 Устранение мерцания при выводе, двойная буферизация
- •5. Апплеты двойного назначения
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Рисование в окне
- •1.1 Графика
- •1.2 Цвет
- •1.3 Шрифты
- •1.4 Приложение FontsList
- •2. Обработка событий
- •2.1 Как обрабатываются события
- •2.2 События от мыши
- •2.3 Приложение LinesDraw
- •2.4 События от клавиатуры
- •2.5 Приложение KeyCodes
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Компоненты gui
- •2. Устройства или элементы управления
- •2.1 Кнопки
- •2.2 Флажки (или переключатели)
- •2.3 Меню выбора (или выпадающие списки)
- •2.4 Раскрывающиеся списки
- •2.5 Полосы прокрутки
- •2.6 Метки
- •2.7 Текстовые компоненты
- •3. Приложение AllElements
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Контейнеры
- •1.1 Панели
- •1.2 Окна
- •1.3 Рамки, фреймы
- •2. Менеджеры размещения компонентов
- •2.1 Типы менеджеров размещения
- •3. Поведение контейнера при наличии элементов управления
- •4. Приложение PanelsDemo1
- •5. Приложение PanelsDemo2
- •6. Приложение WindowsDemo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Процессы, задачи и приоритеты
- •2. Реализация многозадачности в Java
- •2.1 Создание подкласса Thread
- •2.2 Реализация интерфейса Runnable
- •2.3 Применение мультизадачности для анимации
- •2.4 Апплет двойного назначения, реализующий интерфейс Runnable
- •3. Потоки (нити)
- •3.1 Состояние потока
- •3.2 Исключительные ситуации для потоков
- •3.3 Приоритеты потоков
- •3.4 Группы потоков
- •4. Приложение VertScroller
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Автономные приложения. Потоки данных. Работа с локальными файлами (2 часа) методические указания к лабораторной работе
- •1. Самостоятельные графические приложения
- •2. Потоки ввода-вывода в Java
- •2.1. Обзор классов Java для работы с потоками
- •2.2 Стандартные потоки ввода-вывода
- •2.3 Потоки, связанные с локальными файлами
- •2.3.1 Создание потоков, связанных с локальными файлами
- •2.3.2 Запись данных в поток и чтение их из потока
- •2.3.3 Закрытие потоков
- •2.3.4 Принудительный сброс буферов
- •2.3.5 Приложение StreamDemo
- •2.4 Потоки в оперативной памяти
- •3 Работа с локальной файловой система
- •3.1 Работа с файлами и каталогами
- •3.2 Приложение DirList
- •3.3 Произвольный доступ к файлам
- •3.4 Просмотр локальной файловой системы
- •3.5 Приложение FileDialogDemo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Сетевые приложения: передача данных с использованием сокетов (2 часа)
- •1. Сокеты
- •2. Протокол tcp/ip, адрес ip и класс InetAddress
- •3. Потоковые сокеты
- •3.1 Создание и использование канала передачи данных
- •3.2 Конструкторы и методы класса Socket
- •3.3 Пример использования потоковых сокетов
- •4. Датаграммные сокеты (несвязываемые датаграммы)
- •4.1 Конструкторы и методы класса DatagramSocket
- •4.3 Пример использования датаграммных сокетов
- •5 Приложения ServerSocketApp и ClientSocketApp
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Связь по сети с помощью url (2 часа) методические указания к лабораторной работе
- •1. Универсальный адрес ресурсов url
- •2. Класс java.Net.Url в библиотеке классов Java
- •3. Использование класса java.Net.Url
- •3.1 Чтение из потока класса InputStream, полученного от объекта класса url
- •3.2 Получение содержимого файла, связанного с объектом класса url
- •4. Соединение с помощью объекта класса urlConnection
- •5. Приложение Diagram
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Создание и использование сервлетов (2 часа) методические указания к лабораторной работе
- •1. Как устроен сервлет
- •2. Вспомогательные классы
- •3. Запуск и настройка сервлетов
- •4. Сервлет example, принимающий параметры
- •5. Сервлет, обрабатывающий запросы на основе методов cet и post
- •6. Сервлет MyselfInfo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Работа с базами данных, использование интерфейса jdbc(2 часа) методические указания к лабораторной работе
- •1. Написание апплетов, сервлетов и приложений jdbc
- •1.1 Соединение с базой данных
- •1.2 Применение интерфейса DatabaseMetaData
- •1.3 Посылка статичных sql-запросов
- •1.4 Посылка параметризированных и частовыполняемых sql-запросов
- •1.5 Выборка результатов
- •1.6 Применение интерфейса ResultSetMetaData
- •1.7 Доступ к хранимым функциям и процедурам
- •1.8 Применение выходных параметров
- •2. Обработка исключений jdbc
- •3. Отладка приложений jdbc
- •4. Сервлет, работающий с информацией из базы данных
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Приложение 1 java-файл простейшего апплета и html-документ со ссылкой на него
- •Приложение 2 java-файл апплета, принимающего параметры, и html-документ со ссылкой на него
- •Приложение 3 java-файл апплета, обрабатывающего простые события мыши, и html-документ со ссылкой на него
- •Приложение 4 java-файлы апплета двойного назначения и html-документ со ссылкой на него
- •Приложение 5 java-файлы апплета двойного назначения, обрабатывающего сообщения от мыши, и html-документ со ссылкой на него
- •Приложение 6 java-файл апплета двойного назначения, реализующего интерфейс runnable, и html-документ со ссылкой на него
- •Приложение 7 самостоятельное графическое java-приложение
2.3 Потоки, связанные с локальными файлами
Рассмотрим процесс создания и использования потоков, связанных с локальными файлами, а также вопрос закрытия потоков после использования и принудительный сброс буферов.
2.3.1 Создание потоков, связанных с локальными файлами
Для создания входного или выходного потока, связанного с локальным файлом следует воспользоваться классами из библиотеки Java, созданными на базе классов InputStream и OutputStream. Однако необходимо всегда помнить о некоторых особенностях методики использования рассматриваемых ранее потоков.
Особенность этой методики заключается в том, для создания потоков, связанных с файлами, необходимо воспользоваться сразу несколькими классами, а не одним, на первый взгляд казалось бы, наиболее подходящим.
Рассмотрим пример. Пусть необходимо создать выходной поток для записи форматированных данных (например, текстовых строк). За форматированный вывод отвечает поток класса DataOutputStream. Однако, сразу создать объект класса DataOutputStream, связанный с файлом нельзя, так как в классе DataOutputStream предусмотрен только один конструктор, которому в качестве параметра необходимо передать ссылку на объект класса OutputStream:
public DataOutputStream(OutputStream out);
Что же касается конструктора класса OutputStream, то он выглядит следующим образом:
public OutputStream();
Так как ни в одном, ни в другом конструкторе не предусмотрено никаких ссылок на файлы, то пока совершенно непонятно, как с использованием одних только классов DataOutputStream и OutputStream можно создать выходной поток, связанный с локальным файлом.
Создание потока форматированных данных, связанного с локальным файлом.
Создание потоков, связанных с файлами и предназначенных для форматированного ввода и вывода, необходимо выполнять в несколько приемов. При этом вначале необходимо создать потоки на базе класса FileOutputStream или FileInputStream, а затем передать ссылкуна созданный поток конструктору класса DataOutputStream или DataInputStream.
В классах FileOutputStream и FileInputStream предксмотрены конструкторы, которым в качестве параметроа передается либо ссылка на объект класса File, либо ссылка на объект класса FileDescriptor, либо текстовая строка пути к файлу, например:
public FileOutputStream(File fileObj);
public FileOutputStream(FileDescriptor fdObj);
public FileOutputStream(String name);
Таким образом, если нужен выходной поток для записи в файл форматированных данных, то это делается в два этапа:
сначала необходимо создать поток как объект класса FileOutputStream;
затем ссылку на этот поток следует передать конструктору класса DataOutputStream.
Полученный таким способом объект dataOut класса DataOutputStream
DataOutputStream dataOut;
dataOut=new DataOutputStream(new FileOutputStream("output.txt"));
можно использовать как выходной поток, связанный с файлом output.txt, записывая в него форматированные данные:
Для создания входного потока форматированных данных из файла следует пользоваться классами FileInputStream и DataInputStream, действуя по аналогичной методике.
Добавление буферизации.
В случае, если необходим не простой выходной или входной поток, а буферизированный, необходимо еще воспользоваться классом BufferedOutputStream или BufferedIntputStream. Вот два конструктора, предусмотренные, например, в классе BufferedOutputStream:
public BufferedOutputStream(OutputStream out);
public BufferedOutputStream(OutputStream out, int size);
Первый из них создает буферизированный выходной поток на базе потока класса OutputStream, а второй делает то же самое, но дополнительно позволяет указать размер буфера в байтах
Если необходимо создать выходной буферизированный поток для записи форматированных данных, связанный с файлом, то создание потока выполняется в три приема:
создается поток, связанный с файлом, как объект класса FileOutputStream;
ссылка на этот поток передается конструктору класса BufferedOutputStream, в результате чего образуется буферизированный поток, связанный с файлом;
ссылка на буферизированный поток, созданный на предыдущем шаге, передается конструктору класса DataOutputStream, который и создает нужный поток.
Вот фрагмент исходного текста программы, который создает выходной буферизированный поток для записи форматированных данных в файл output.txt:
DataOutputStream dataOut;
dataOut=new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("output.txt")));
Для создания входного буферизированного потока форматированных данных из файла следует пользоваться классами FileInputStream, BufferedIntputStream и DataInputStream, действуя по аналогичной методике.
Исключения при создании потоков, связанных с файлами.
При создании потоков на базе класса FileOutputStream или FileInputStream могут возникать исключения FileNotFoundException (попытка открыть входной поток данных для несуществующего файла), SecurityException (попытка открыть файл, для которого запрещен доступ, например, попытка открытия файла с атрибутом read-only для записи) и IOException (если файл не может быть открыт для записи по каким-либо другим причинам).