Иерархия классов потоков ввода-вывода
Рис. 6.1. Иерархия символьныx потоков
Рис. 6.2. Классы байтовых потоков
Классы, создающие потоки можно разделить на пять групп:
Классы, создающие потоки, связанные с файлами:
Классы, создающие потоки, связанные с массивами:
Классы, создающие каналы обмена информацией между подпроцессами:
Классы, создающие символьные потоки, связанные со строкой:
Классы, создающие байтовые потоки из объектов Java:
Классы, управляющие потоком, получают в своих конструкторах уже имеющийся поток и создают новый, преобразованный поток. Четыре класса выполняют буферизованный ввод/вывод: BufferedReader BufferedInputStream BufferedWriter BufferedOutputStream Два класса преобразуют поток байтов в восемь простых типов Java:
DataInputStream DataOutputStream Два класса связаные с выводом на строчные устройства — экран дисплея, принтер: PrintWriter PrintStream Два класса связывают байтовый и символьный потоки: InputStreamReader OutputStreamWriter
Класс StreamTokenizer позволяет разобрать входной символьный поток на отдельные элементы (tokens) подобно тому, как класс StringTokenizer разбираeт строку. Из управляющих классов выделяется класс SequenceInputStream, сливающий несколько потоков, заданных в конструкторе, в один поток, и класс LineNumberReader, "умеющий" читать выходной символьный поток построчно. Строки в потоке разделяются символами '\n' и/или '\r'.
Консольный ввод/вывод. Для вывода на консоль используется метод println() класса PrintStream. Вместо System.out.println(), то вы можете определить новую ссылку на System.out, например:
PrintStream pr = System.out; и писать просто pr.println(). Консоль является байтовым устройством, и символы Unicode перед выводом на консоль должны быть преобразованы в байты. Трудности с отображением кириллицы возникают, если вывод на консоль производится в кодировке, отличной от локали. Именно так происходит в русифицированных версиях MS Windows. Обычно в них устанавливается локаль с кодовой страницей СР1251, а вывод на консоль происходит в кодировке СР866. В этом случае надо заменить PrintStream, который не может работать с символьным потоком, на PrintWriter и вставить "переходное кольцо" между потоком символов Unicode и потоком байтов System.out, выводимых на консоль, в виде объекта класса OutputStreamWriter. В конструкторе этого объекта следует указать нужную кодировку, в данном случае, СР866. Все это можно сделать одним оператором:
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out, "Cp866"), true);
Класс PrintStream буферизует выходной поток. Второй аргумент true его конструктора вызывает принудительный сброс содержимого буфера в выходной поток после каждого выполнения метода println(). После этого можно выводить любой текст методами класса PrintWriter, которые просто дублируют методы класса PrintStream, и писать, например, pw.println("Это русский текст"); Если вы пользуетесь окном Output в Netbeans 7 как консолью (так происходит в Netbeans 7 по умолчанию), то кодировку менять не нужно, там сразу используется локаль. Ввод с консоли производится методами read() класса InputStream с помощью статического поля in класса System. С консоли идет поток байтов, полученных из scan-кодов клавиатуры. Эти байты должны быть преобразованы в символы Unicode такими же кодовыми таблицами, как и при выводе на консоль. Преобразование идет по той же схеме — для правильного ввода кириллицы удобнее всего определить экземпляр класса BufferedReader, используя в качестве "переходного кольца" объект класса InputStreamReader: BufferedReader br = new BufferedReader(new InputStreamReader (System.in, "Cp866"));
Класс BufferedReader переопределяет три метода read() своего суперкласса Reader. Кроме того, он содержит метод readLine(). Метод readLine() возвращает строку типа string, содержащую символы входного потока, начиная с текущего, и заканчивая символом '\n' и/или '\r'. Эти символы-разделители не входят в возвращаемую строку. Если во входном потоке нет символов, то возвращается null.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|