|
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, то их инициализацию мы производим в статическом блоке. Продолжение статьи: ч.1 Продолжение статьи: ч.2 Продолжение статьи: ч.3 Продолжение статьи: ч.4 Продолжение статьи: ч.5 Продолжение статьи: ч.6 Другие статьи по теме: - Java: русские буквы и не только...- революция java - возможности языка java - Java: управление ресурсами - почтовая программа - своими руками! |
|
2006-2024 © SMTI.RU Главная страница | Связаться с нами |