Смекни!
smekni.com

Распределенные системы обработки информации (стр. 3 из 7)

Классы Reader и Writer аналогичны InputStream и OutputStream, но используются для Unicode-текстов.

Потоки ввода-вывода можно объединять в цепочки:

FileInputStream fin = new FileInputStream(“file.dat”);

DataInputStream din – new DataInputStream(fin);

double s = din.readDouble();

Консольный ввод-вывод осуществляется с помощью объектов System.in (типа InputStream) и System.out (типа PrintStream).

1.13 Форматированный ввод-вывод в Java (J2SE 1.5)

Класс Formatter – основа логики форматирования. Примеры опции форматирования - задание точности и ширины дробного числа (%7.4f), представлеие времени (%tT). Можно применять различные форматы для одного аргумента – в этом случае указываеться порядковый номер аргумента (%3$s для третьего). Общий вид параметра:

%[argument_index$][flags][width][.precision]conversion

Конструктору класса Formatter можно передать локаль желаемого языка. Само форматирование осуществляется методом format(). Подобно printf в него передается строка с шаблоном форматирования и аргументы. Можно использовать локаль, отличную от той, что использовалась в конструкторе:

public Formatter format(String format, Object... args)

public Formatter format(Locale l, String format, Object... args)

formatter.format("PI = %12.10f", Math.PI);

Классы PrintStream, PrintWriter позволяют перенаправить форматированный текст в поток. В стандартных потоках (System.out, System.err) есть методы, позволяющие сразу передавать в них форматированный текст. Кроме метода format() в классах, работающих с потоками, появляется printf(). Это синонимиы – ведут себя одинаково.

public PrintStream format(String format, Object... args)

public PrintStream format(Locale l, String format, Object... args)

System.out.format("Сегодня %1$tB %1$te, %1$tY.", Calendar.getInstance());

В классе String имеется метод format(). Работает так же, но возвращает String.

Можно использовать собственные объекты с Formatter – для этого применяется интерфейс Formattable. Реализовав метод formatTo() в своем классе, можно использовать класс в качестве аргумента при форматировании строк:

void formatTo(Formatter formatter, int flags, Integer width, Integer precision);

Класс Scanner – простой сканер, который может считывать простые типы и строки. Есть частичная поддержка регулярных выражений. Scanner разбивает ввод, используя образец разделителя (пробел по умолчанию). Из полученных лексем значения простых типов достаются nextХХХ() методами: nextBoolean(), nextFloat(),nextInt() и т.д. и т.п.

Scanner scanner = new Scanner(System.in);

int i = scanner.nextInt();

Методы hasNextXXX() (hasNextInt(), hasNextDouble(), …) проверяют – является ли очередная лексема значением указанного типа.

1.14 О программировании графики в Java

Сначала в Java появилась библиотека AWT (abstract window toolkit) (java.awt), которая использовала платформенно-зависимые средства для отображения элементов GUI. Позже появилась IFC (internet foundation classes), которая все элементы интерфейса рисовала в окне. Ее преемницей стала библиотека Swing (javax.swing), которая используется и сейчас. Swing не может работать самостоятельно, без опоры на AWT. Swing работает медленнее, чем AWT, но предоставляет более богатый набор средств, не зависит от платформы (меньше ошибок) и на всех платформах выглядит одинаково.

Окно верхнего уровня (не содержащееся внутри других окон) называется фреймом: классы Frame (AWT) и JFrame (Swing).

Отображать данные можно непосредственно на фрейме, но обычно он используется как контейнер для других GUI-компонентов. Фрейм состоит из нескольких слоев-областей (корневой области, область слоя, прозрачная область и область отображения). Компоненты размещаются на области отображения. Например, чтобы разместить компонент:

Container contentPane = frame.getContentPane();

Component c = …;

contentPane.add(c);

Для рисования на компоненте необходимо переопределить его метод void paintComponent(Graphics g). Graphics – набор настроек контекста для рисования. Метод paintComponent вызывается автоматически, когда требуется перерисовка компонента, но можно вызвать его принудительно с помощью метода repaint().

При обработке событий в библиотеке AWT события передаются от источников (например, кнопок) к обработчикам. Объект события – это объект подкласса java.util.EventObject, который несет в себе информацию о событии. Обработчик – это любой объект класса, реализующего специальный интерфейс.

Пример:

class MyListener implements ActionListener {

public void actionPerformed(ActionEvent event) {…}

}

ActionListener listener = new MyListener();

JButton button = new JButton(“OK”);

button.addActionListener(listener);

В качестве обработчиков часто используются вложенные классы.

1.15 Реализация технологии клиент-сервер на Java

Обмен данными между клиентом и сервером осуществляется посредством механизма сокетов. Для поключения к удаленному хосту используется класс Socket, конструктор которого принимает имя хоста и порт подключения. После подключения вызываются методы getInputStream() и getOutputStream() для получения входного и выходного потока сокета. Закрытие сокета осуществляет метод close().

Для создания сервера используется класс ServerSocket:

ServerSocket ss = new ServerSocket(1234); /* сокет для прослушивания порта */

Socket incoming = s.accept(); /* сокет для обмена данными с клиентом */

s.close();

Обычно сервер делают многопоточным с одним главным потоком, который принимает входящие соединения и распределяет их по потокам (например, с помощью блокирующих очередей).

Классы URL и URLConnection инкапсулируют подробности извлечения информации с удаленного узла.

URL url = new URL(“somehost”);

URLConnection con = url.openConnection();

// настроить подключение …

con.connect(); // запрос заголовка

// обработка полей заголовка …

InputStream is = con.getInputStream();

Для представления интернет-адресов используется класс java.net.InetAddress.

1.16 Апплеты в Java

Апплеты – это программы на Java, загружаемые с веб-сервера и выполняемые в браузере. Апплет представляет собой GUI-программу, написанную с помощью AWT и/или Swing с той разницей, что в данном случае программа запускается не из функции main, а путем создания объекта класса, унаследованного от класса Applet (JApplet). Applet является потомком класса Panel.

После компиляции программы создается HTML-файл, содержащий фрагмент:

<applet code=”MyFile.class” … />

В классе, унаследованном от Applet, есть методы, связанные с жизненным циклом апплета:

init() – выполняется при инициализации апплета, аналог функции main(). Должен быть перегружен.

start() – выполняется при запуске апплета.

stop() – выполняется, когда пользователь покидает страницу с апплетом.

destroy() – выполняется при завершении работы браузера.

Хотя обычно апплет не требует создания фреймов и выполняется на панели, тем не менее, можно создать фрейм. Он будет отображен в отдельном окне вне браузера, но при этом не будет самостоятельным приложением.

Если в классе апплета, унаследованном от Applet, определить функцию main, можно добиться работы приложения как в виде апплета, так и в виде обособленного приложения.

Апплеты работают в обособленной «песочнице» (sandbox). При выполнении апплетов действуют строгие правила безопасности: нельзя запускать исполняемые файлы на компьютере пользователя, нельзя взаимодействовать ни с какими компьютерами, кроме сервера, нельзя обращаться к локальной файловой системе, нельзя получать информацию о локальном компьютере (за исключением минимальной). Нарушение этих правил ведет к генерации исключения SecurityException. Некоторые правила можно обойти, если подписать апплет электронной подписью.

1.17 Технология RMI в Java

RMI (remote method invocation) – технология удаленного вызова методов объектов, написанных на Java. Клиент – тот, кто вызывает метод. Сервер – тот, чей метод вызывается. На клиентской стороне представителем серверного объекта является заглушка (stub), метод которой фактически вызывает клиент. При вызове метода заглушка осуществляет сериализацию объектов, их кодирование (маршалинг), упаковывает их в блок вместе с информацией о вызываемом методе и передает серверу. На сервере объект-получатель (скелетон) выполняет обратные действия, осуществляет выполнение метода, и таким же образом передает результаты обратно клиенту.

Для удаленного вызова клиент использует интерфейсную переменную (которая на самом деле ссылается на заглушку).

При передаче объекта между виртуальными машинами обе машины должны иметь доступ к файлу класса.

Совместно используемый интерфейс должен расширять интерфейс java.rmi.Remote, а все методы интерфейса должны сообщать о том, что при их выполнении может возникнуть исключение RemoteException. Соответственно, при любом вызове удаленного метода надо перехватывать RemoteException. Серверный объект должен наследовать java.rmi.server.RemoteServer (абстрактный класс), но можно и конкретную реализацию – UnicastRemoteObject.

В JDK классы заглушки и каркасы (скелетоны) генерируются автоматически, раньше нужно было использовать утилиту rmic.

Для получения ссылки на заглушку на клиентской стороне используется служба регистрации самозагрузки (bootstrap registry service). Сервер регистрирует удаленный объект под определенным именем, а клиент его получает. Например:

// сервер

IfaceImpl pl = new IfaceImpl();

Context namingContext = new InitialContext();

namingContext.bind(“rmi:myobject”m pl);

// клиент

Iface p = (Iface)namingContext.lookup(“rmi://myserver.com/toaster”);

Служба регистрации автозагрузки должна быть запущена в операционной системе отдельно

1.18 Об интерфейсе JDBC

Модель JDBC основана на ODBC: программа взаимодействует с диспетчером драйверов JDBC, который выбирает подходящий в данном случае драйвер (например, драйвер Oracle) или мост (например, мост JDBC/ODBC). Целью разработки JDBC была разработка модели, работающей одинаково независимо от платформы и от поставщика данных. Предполагалось, что вся работа с БД будет осуществляться с помощью SQL и Java. Классы JDBC располагаются в пакетах java.sql и javax.sql.

Подключение к БД:

Connection con = DriverManager.getConnection(url, username, password);

Выполнение запроса:

Statement st = con.createStatement();

ResultSet rs = st.executeQuery(“SELECT …”);

ResultSet может быть сделан обновляемым (то есть вносимые изменения отражаются в БД), если указать особые параметры при создании Statement.