|
Java-приложение: заглянем внутрьЧтобы иметь возможность читать и изменять ссылки на потоки (а это нам нужно), у нас имеется тройка методов для чтения ссылок и тройка методов для установки новых ссылок. Все читающие методы начинаются с приставки get, а устанавливающие - с приставки set. Внимательный читатель заметит, что в качестве типа параметров методов setOut() и setErr() выступает класс OutputStream, хотя, как раньше отмечалось, потоки System.out и System.err имеют тип PrintStream. Это объясняется очень просто: абстрактный класс OutputStream является предком всех потоковых классов, и поэтому в качестве параметра можно подставить ссылку на любой класс-наследник от OutputStream, что удобно. Захотели вывести данные в файл, а не на консоль - пожалуйста! Пользовательский интерфейс для мониторинговых классов должен быть удобным. Пришлось немного повозиться и придумать такие классы, которые было бы легко запомнить и еще легче использовать, например класс SetIn (см. Листинг 2), записанный в файле SetIn.java ниже. Листинг 2. Создание класса SetIn package Mitrich.utils; import java.io.InputStream; import java.io.OutputStream; /** * Данный класс служит для перенаправления * потока in * Зарезервирован для личных целей пользователя */ public final class SetIn { /** * Предотвращает создание экземпляра класса */ private SetIn() { } /** * Перенаправить поток in на другой поток */ public static void to(InputStream stream) { StdStreams.setIn(stream); } /** * Устанавливает поток in на System.in */ public static void toDefault() { StdStreams.setIn( System.in ); } } Он включает в себя описание самого класса и нескольких его методов. На пустой закрытый конструктор не стоит обращать внимания - он служит лишь для того, чтобы какой-нибудь "умелец" не смог создать экземпляр класса SetIn оператором new (попытавшись, он получит от компилятора отказ). Чтобы экземпляр класса создавался автоматически, его методы должны быть статическими. Тогда при обращении к одному из них виртуальная машина Java сама загрузит объект класса SetIn и выполнит вызванный метод. Вторая цель, которая преследовалась при описании методов как static, - заставить пользователя всегда употреблять имена методов вместе с именем класса, а, если вы помните, ссылка на статические поля и методы класса возможна лишь при использовании полного имени, включающего имя класса, которому поля и методы принадлежат. Так что, если мы хотим переопределить поток in в другое место, то директива будет выглядеть примерно так: FileInputStream s = new FileInputStream("SomeFile.dat"); ... SetIn.to(s); Как видите, переназначение потока ввода читается как естественная фраза на английском языке, чего мы, собственно, и хотели добиться. Сам метод реализован элементарно: он обращается к классу StdStreams, о котором мы уже говорили, и устанавливает поток ввода вызовом метода StdStreams.setIn(). Теперь вы наверняка поняли, зачем мы объявили класс StdStreams с областью видимости package - он виден лишь для классов, которые расположены внутри того же самого пакета. Но вернемся к классу SetIn. Второй метод сбрасывает последнее выполненное переназначение и устанавливает поток ввода в начальное положение на System.in. Вызов этого метода тоже похож на естественный английский язык: SetIn.toDefault(); Продолжение статьи: ч.1 Продолжение статьи: ч.2 Продолжение статьи: ч.3 Продолжение статьи: ч.4 Продолжение статьи: ч.5 Продолжение статьи: ч.6 Другие статьи по теме: - революция java- Java: управление ресурсами - Java-приложение: заглянем внутрь - Java: русские буквы и не только... - учим java. этап первый: подготовительный |
|
2006-2024 © SMTI.RU Главная страница | Связаться с нами |