
- •Введение
- •1 Тема 1. Введение в теорию вычислительных сетей
- •1.1 Общая классификация систем обработки данных
- •1.1.1 Сосредоточенные системы
- •1.1.2 Распределенные системы
- •1.1.3 Распределенные вычислительные сети
- •1.2 Сетевые объектные системы
- •1.2.1 Классические приложения модели OSI
- •1.2.2 Распределенная вычислительная среда (DCE)
- •1.2.3 Технология CORBA
- •1.2.4 Удаленный вызов методов
- •1.3 Сервис-ориентированные технологии
- •1.3.1 Функции и сервисы
- •1.3.2 Системы midlleware
- •1.3.3 Сервисные шины предприятий
- •1.4 Виртуальные системы
- •1.4.1 Виртуальные машины
- •1.4.2 Виртуализация вычислительных комплексов на уровне ОС
- •1.4.2 Виртуализация ПО на уровне языка
- •1.4.3 Виртуальная машина языка Java
- •1.5 Итоги теоретических построений
- •Вопросы для самопроверки
- •2 Тема 2. Инструментальные средства языка Java
- •2.1 Общее описание инструментальных средств языка
- •2.1.1 Инструментальные средства командной строки
- •2.1.2 Пакетная организация языка Java
- •2.1.3 Инструментальные средства Eclipse
- •2.2 Классы и простые типы данных
- •2.2.1 Операторы и простые типы данных
- •2.2.2 Синтаксис определения классов
- •2.2.3 Синтаксис и семантика методов
- •2.2.4 Синтаксис определения интерфейсов
- •2.2.5 Объекты и переменные
- •2.3 Управляющие операторы языка
- •2.4 Потоки ввода-вывода
- •2.4.1 Стандартный ввод-вывод
- •2.4.2 Классы потоков ввода
- •2.4.3 Классы потоков вывода
- •2.5 Управление сетевыми соединениями
- •2.5.1 Адресация на базе класса InetAddress
- •2.5.2 Адресация на базе URL и URLConnection
- •2.5.3 Сокеты протокола TCP
- •2.5.4 Сокеты протокола UDP
- •2.5.5 Простейшая задача технологии клиент-сервер
- •2.6 Организация доступа к базам данных
- •2.6.1 Инструментальные средства СУБД Apache Derby
- •2.6.2 SQL-запросы и драйверы баз данных
- •2.6.3 Типовой пример выборки данных
- •Вопросы для самопроверки
- •3 Тема 3. Объектные распределенные системы
- •3.1 Брокерные архитектуры
- •3.1.1 Вызов удаленных процедур
- •3.1.2 Использование удаленных объектов
- •3.2 Технология CORBA
- •3.2.1 Брокерная архитектура CORBA
- •3.2.2 Проект серверной части приложения NotePad
- •3.2.3 Проект клиентской части приложения Example12
- •3.2.4 Генерация распределенного объекта OrbPad
- •3.2.5 Реализация серверной части ORB-приложения
- •3.2.6 Реализация клиентской части ORB-приложения
- •3.3 Технология RMI
- •3.3.1 Интерфейсы удаленных объектов
- •3.3.2 Реализация RMI-сервера
- •3.3.3 Реализация RMI-клиента
- •Вопросы для самопроверки
- •4 Тема 4. Web-технологии распределенных систем
- •4.1 Общее описание технологии web
- •4.1.1 Унифицированный идентификатор ресурсов (URI)
- •4.1.2 Общее представление ресурсов (HTML)
- •4.1.3 Протокол передачи гипертекста (HTTP)
- •4.2 Модели «Клиент-сервер»
- •4.2.1 Распределение приложений по уровням
- •4.3 Технология Java-сервлетов
- •4.3.1 Классы Servlet и HttpServlet
- •4.3.2 Контейнер сервлетов Apache Tomcat
- •4.3.3 Диспетчер запросов - RequestDispatcher
- •4.3.4 Технология JSP-страниц
- •4.3.5 Модель MVC
- •Вопросы для самопроверки
- •5 Тема 5. Сервис-ориентированные архитектуры
- •5.1 Концепция SOA
- •5.1.1 Связывание распределенных программных систем
- •5.1.2 Web-сервисы первого и второго поколений
- •5.1.3 Брокерные архитектуры web-сервисов
- •5.2 Частные подходы к реализации сервисных технологий
- •5.2.1 Технологии одноранговых сетей
- •5.2.2 Технологии GRID
- •5.2.3 Облачные вычисления и «виртуализация»
- •Вопросы для самопроверки
- •Список использованных источников
- •Алфавитный указатель

66
2.4.3 Классы потоков вывода
Для реализации общих задач вывода информации в языке Java используется базовый класс OutputStream, также принадлежаций пакету java.io. Диаграмма наследования его классов-потоков приведена на рисунке 2.16, а общий синтаксис объявления имеет вид:
OutputStream имя_объекта =
new Конструктор_одного_из_классов_вывода
Рисунок 2.16 — Диаграмма наследования класса OutputStream
Обратим внимание, что на диаграмме присутствует класс стандартного вывода PrintStream, который является дочерним от класса FilterOutputStream. Сам же класс OutputStream имеет много методов, подобных стандартному выводу, а наиболее значимые из них:
|
67 |
|
|
write(int b) |
Запись одного байта b в поток вывода. |
|
|
write(byte[] b ) |
Запись массива байт b в поток вывода. |
|
|
write(byte[] b, |
Запись в поток вывода части массива b длинной len, начиная |
int off, int len) |
с позиции off. |
flush() |
Принудительный сброс данных из промежуточного буфера в |
|
поток вывода. |
close() |
Закрывает выходной поток вывода. |
|
|
Рассмотрим программу листинга 2.9, демонстрирующую использование выходного потока FileOutputStream на примере создания текстового файла с помощью объекта класса OutputStream, последующего чтения этого файла и отображения результата чтения на стандартный вывод.
Листинг 2.9 — Исходный текст класса Example7 из среды Eclipse EE
package ru.tusur.asu;
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;
public class Example7 {
public static void main(String[] args) {
// Объявление буфера и счетчика читаемых байт byte[] b;
int n;
System.out.println("Демонстрация потока FileOutputStream.\n"
+ |
"Создание и чтение файла: /home/vgr/demo7.txt \n" |
+ |
"----------------------------------------------\n"); |
try{
OutputStream out =
new FileOutputStream("/home/vgr/demo7.txt");
// Пишем строки в файл
out.write("Привет всем друзьям!\n".getBytes());
out.write("Мы написали программу записи в файл.\n".getBytes()); out.write("Посмотрим, что из этого получится...\n".getBytes());
out.flush(); |
// |
Сбрасываем |
поток |
вывода |
out.close(); |
// |
Закрываем |
поток |
вывода |
InputStream in =
new FileInputStream("/home/vgr/demo7.txt");
while ((n = in.available()) > 0) // Читаем в цикле
{
b = new byte[n]; in.read(b);

68
System.out.print(new String(b));
}
in.close(); // Закрываем поток ввода
}catch(IOException e)
{
System.out.println(e.getMessage());
}
}
}
Следует особо обратить внимание, что при записи в файл:
•используется метод write(byte[] b), оперирующий с заранее созданным массивом байт;
•строки символов, заключенные в двойные кавычки, являются объектами и к ним применяется статический метод getBytes() из класса java.lang.String, динамически преобразующий объект строки в массив байт;
•перед закрытием любого выходного потока методом close() всегда нужно сбрасывать промежуточный буфер вывода методом flush().
Завершая изучение общих вопросов программирования на языке Java, рассмотрим пример использования класса File, представленный на листинге 2.10 и демонстрирующий ряд характеристик уже созданного файла /home/vgr/demo7.txt.
Листинг 2.10 — Исходный текст класса Example8 из среды Eclipse EE
package ru.tusur.asu;
import java.io.File; import java.util.Date;
public class Example8 {
public static void main(String[] args) { |
|
|||
|
// Определяем и создаем объект класса |
File |
||
|
File myf = new File("/home/vgr/demo7.txt"); |
|||
|
|
out.println("Это |
- файл: " |
+ myf.isFile()); |
|
System. |
|||
|
System. |
out.println("Это |
- директория: |
" + myf.isDirectory()); |
System.out.println("Можно писать в файл: " + myf.canWrite()); System.out.println("Можно читать файл: " + myf.canRead()); System.out.println("Можно запускать файл: " + myf.canExecute());
System. |
out.println("Имеет родителя: |
" + myf.getParent()); |
|
System. |
out.println("Имеет путь: |
" + |
myf.getPath()); |
System. |
out.println("Имеет имя: |
" + |
myf.getName()); |
System.out.println("Длина файла: " + myf.length()); System.out.println("Последняя модификация: "
+ new Date(myf.lastModified()));
}
}