Философия Java3
вернуться

Эккель Брюс

Шрифт:

public class Echo {

public static void main(String[] args) throws IOException {

BufferedReader stdin = new BufferedReaderC new InputStreamReader(System in)),

String s,

while((s = stdin readLineO) != null && s.lengthO! = 0)

System.out.printin(s); // Пустая строка или нажатие Ctrl+Z завершает программу

}

} ///-

Присутствие спецификации исключений объясняется тем, что метод readLineO может возбуждать исключение IOException. Снова обратите внимание, что поток System.in обычно буферизуется, впрочем, как и большинство потоков.

Замена System.in на PrintWriter

Стандартный вывод System.out является объектом PrintStream, который, в свою очередь, наследует от базового класса OutputStream. В классе PrintWriter имеется конструктор, который принимает в качестве аргумента выходной поток Output-Stream. Таким образом, вы можете преобразовать поток стандартного вывода System.out в символьно-ориентированный поток PrintWriter:

II. io/ChangeSystemOut.java

// Преобразование System out в символьный поток PrintWriter import java io *.

public class ChangeSystemOut {

public static void main(String[] args) {

PrintWriter out = new PrintWriterCSystem.out, true); out printlnC"Hello, world");

}

} /* Output. Hello, world */// ~

Важно использовать конструктор класса PrintWriter с двумя аргументами, и передать во втором аргументе true, чтобы обеспечить автоматический сброс буфера на печать, иначе можно вовсе не увидеть никакого вывода.

Перенаправление стандартного ввода/вывода

Класс System позволяет вам перенаправить стандартный ввод, вывод и поток ошибок. Для этого предусмотрены простые статические методы: setln(InputStream); setOut(PrintStream); setErr(PrintStream).

Перенаправление стандартного вывода особенно полезно тогда, когда ваша программа выдает слишком много сообщений сразу и вы попросту не успеваете читать их, поскольку они заменяются новыми сообщениями. Перенаправление ввода удобно для программ, работающих с командной строкой, в которых необходимо поддержать некоторую последовательность введенных пользователем данных. Вот простой пример, показывающий, как использовать эти методы:

//: io/Redirecting.java

// Перенаправление стандартного ввода/вывода.

import java io.*.

public class Redirecting {

public static void main(String[] args) throws IOException {

PrintStream console = System.out; BufferedlnputStream in = new BufferedlnputStreamC new FilelnputStreamCRedirecting.java")); PrintStream out = new PrintStreamC new BufferedOutputStreamC

new FileOutputStream("test.out")));

System.setln(in); System.setOutCout); System.setErr(out);

BufferedReader br = new BufferedReaderC

new InputStreamReader(System.in));

String s;

while((s = br.readLineO) != null)

System.out.printin(s); out closeO, // He забывайте! System.setOut(console);

}

} ///.-

Программа присоединяет стандартный ввод к файлу и перенаправляет, стандартный ввод и поток для ошибок в другие файлы. Обратите внимание

на сохранение ссылки на исходный объект System.out в начале программы и его восстановление в конце.

Перенаправление основано на байтовом, а не на символьном вводе/выводе, поэтому в примере используются InputStream и OutputStream, а не их символь-но-ориентированные эквиваленты Reader и Writer.

Новый ввод/вывод (nio)

При создании библиотеки «нового ввода/вывода» Java, появившейся в JDK 1.4 в пакетах java.nio.*, ставилась единственная цель: скорость. Более того, «старые» пакеты ввода/вывода были переписаны с учетом достижений nio, с намерением использовать преимущества повышенного быстродействия, поэтому улучшения вы получите, даже если не будете писать явный т'о-код. Подъем производительности просматривается как в файловом вводе/выводе, который мы здесь рассматриваем, так и в сетевом вводе/выводе.

Увеличения скорости удалось достичь с помощью структур, близких к средствам самой операционной системы: каналов24 (channels) и буферов (buffers). Канал можно сравнить с угольной шахтой, вырытой на угольном пласте (данные), а буфер — с вагонеткой, которую вы посылаете в шахту. Тележка возвращается доверху наполненная углем, который вы из нее выгружаете. Таким образом, прямого взаимодействия с каналом у вас нет, вы работаете с буфером и «посылаете» его в канал. Канал либо извлекает данные из буфера, либо помещает их в него.

  • Читать дальше
  • 1
  • ...
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • ...

Private-Bookers - русскоязычная библиотека для чтения онлайн. Здесь удобно открывать книги с телефона и ПК, возвращаться к сохраненной странице и держать любимые произведения под рукой. Материалы добавляются пользователями; если считаете, что ваши права нарушены, воспользуйтесь формой обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • help@private-bookers.win

Подпишитесь на рассылку: