Главная Контакты


  На сайте

  Java, JavaScript
  Документация Perl
  Документация PHP
  Документация ASP
  Новости сайта
  Flash
  Интернет протоколы
  Apache
  Уроки программирования
  Язык программирования C
 


Java-приложение: заглянем внутрь


Из них следует, что стандартный поток ввода in является ссылкой типа InputStream, а потоки вывода и ошибок out и err - ссылками класса PrintStream. Виртуальная машина Java инициализирует эти ссылки с помощью "родного" кода, который, увы, нам неподконтролен.

Итак, наш план прост: создав альтернативные стандартные потоки, упакуем их поудобнее и придумаем комфортабельный интерфейс доступа к ним, что, собственно говоря, и является главной целью всей этой работы. Начать, разумеется, нужно с создания класса, инкапсулирующего стандартные потоки ввода, вывода и ошибок. Назовем его StdStreams и поместим его исходный текст в файл StdStreams.java (см. Листинг 1).

Листинг 1. Создание класса Stdstreams
package Mitrich.utils; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; /** * Данный класс инкапсулирует стандартные потоки. * Он закрыт для доступа извне и изменений. */ final class StdStreams { private static InputStream in; // Зарезервировано private static PrintStream out; private static PrintStream err; static { StdStreams.setIn ( System.in ); StdStreams.setOut( System.out ); StdStreams.setErr( System.err ); } /** * Возвращает ссылку на поток err. * @return java.io.PrintStream */ PrintStream getErr() { return err; } /** * Возвращает ссылку на поток in. * @return InputStream */ InputStream getIn() { return in; } /** * Возвращает ссылку на поток out. * @return java.io.PrintStream */ PrintStream getOut() { return out; } /** * Устанавливает ссылку на поток in * @param stream java.io.InputStream */ static void setIn(InputStream stream) { in = stream; } /** * Устанавливает ссылку на поток err * @param stream java.io.OutputStream */ static void setErr(OutputStream stream) { err = new PrintStream(stream); } /** * Устанавливает ссылку на поток out * @param stream java.io.OutputStream */ static void setOut(OutputStream stream) { out = new PrintStream(stream); } }

Поскольку созданный нами класс не нуждается в наследовании, он реализован как final. Внутри него располагаются три поля, хранящие ссылки на используемые нами потоки (отмечены модификаторами доступа private и static). Почему они сделаны закрытыми для доступа (privat), вполне понятно: незачем изменять их напрямую. А вот добавление static требует пояснения. Дело в том, что в Java статические поля инициализируются сразу же после создания экземпляра класса. Таким образом, ссылки на потоки гарантированно инициализируются перед использованием и, что более важно, эти поля становятся уникальными для всех экземпляров класса StdStream. Из этого следует, что изменение ссылок на потоки - глобально, и все классы, обращающиеся за сервисом к StdStream, обращаются к одному и тому же полю. Обратите внимание, что ссылка на стандартный поток in считается зарезервированной (нам она не нужна, но чем черт не шутит, а вдруг впоследствии пригодится...). Поскольку все ссылки выполнены как static, то их инициализацию мы производим в статическом блоке.

Другие статьи по теме:

- практическое введение в программирование на javascript
- Java: управление ресурсами
- поисковая оптимизация как вид деятельности
- почтовая программа - своими руками!
- Java: русские буквы и не только...


Голосование:
Чего Вы хотели бы видеть больше на сайте?

Статей, документации
Скриптов
Программ для вебмастера
Я не знаю



Другие голосования

Обмен кнопочками:



Приглашаем Вас обменяться кнопочками! Обращайтесь к администратору.


Новые статьи:


Наши партнеры:





2006-2024 © SMTI.RU
Главная страница | Связаться с нами