Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Иерархия классов потоков ввода-вывода




 

Рис. 6.1. Иерархия символьныx потоков

 

 

Рис. 6.2. Классы байтовых потоков

 

Классы, создающие потоки можно разделить на пять групп:

 

Классы, создающие потоки, связанные с файлами:

FileReader FileInputStream
FileWriter FileOutputStream
RandomAccessFile

Классы, создающие потоки, связанные с массивами:

CharArrayReader ByteArrayInputStream
CharArrayWriter ByteArrayOutputStream

Классы, создающие каналы обмена информацией между подпроцессами:

PipedReader PipedInputStream
PipedWriter PipedOutputStream

Классы, создающие символьные потоки, связанные со строкой:

StringReader StringWriter

Классы, создающие байтовые потоки из объектов Java:

ObjectInputStream ObjectOutputStream

 

Классы, управляющие потоком, получают в своих конструкторах уже имеющийся поток и создают новый, преобразованный поток.

Четыре класса выполняют буферизованный ввод/вывод:

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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...