Главная » Java » Reader в Java

0

 

  Абстрактный класс Reader обеспечивает поддержку символьного потока чтения аналогично тому, как это делает InputStream, реализующий модель байтового потока ввода, и методы Reader схожи с теми, которые объявлены в составе InputStream.

 

public int  read()  throws  lOException

Считывает один символ данных и возвращает его в виде целого числа из диапазона от 0 до 65535. Если символов, готовых для чтения, не существует ввиду достижения конца потока, возвращается значение -1. Метод выполняет блокировку до тех пор, пока имеются доступные для чтения символы, не достигнут конец потока либо не

выброшено исключение.

 

Public abstract int  read(char[]   buf,   int offset,   int count) throws lOException

Считывает символы и сохраняет их в части массива buf типа char. Максимальное количество символов, подлежащих чтению, определяется значением count. Символы заносятся в элементы массива, начиная с buf[offset] и вплоть до buf[offset+count-l], если ранее не будет достигнут конец потока, — содержимое всех остальных   элементов

массива buf остается неизменным. Метод возвращает количество фактически считанных символов. Если ввиду достижения конца потока не считан ни один символ, возвращается -1. Если значение count равно нулю, чтение не производится и возвращается 0. Метод выполняет блокировку до тех пор, пока имеются доступные для чтения символы не достигнут конец потока либо не выброшено исключение. Если первый символ не может быть считан по причине, не связанной с достижением конца потока (например, из-за того, что поток уже закрыт), выбрасывается исключение типа IOException. Как только успешно прочитан хотя бы один символ, любая ошибка, возникающая при попытке чтения последующих данных, не приводит к выбрасыванию исключения, а трактуется как событие получения признака конца потока — метод завершает выполнение нормальным образом и возвращает число символов, считанных до момента возникновения ошибки.

public int  read(char[]  buf)  throws IOException

Метод аналогичен предыдущему при условии read (buf, 0, buf.length).

public long skip(long count)  throws IOException

Пропускает, самое большее, count символов либо часть последовательности символов до конца потока. Возвращает количество фактически пропущенных символов. Значение count не должно быть отрицательным.

public boolean  readyO  throws IOException

Возвращает true, если поток готов для чтения данных, т.е. в нем существует хотя бы один доступный символ. Заметьте, что результат, равный false, отнюдь не свидетельствует о том, что очередной вызов read приведет к возникновению блокировки, поскольку в промежутке между обращениями к ready и read в поток может поступить очередная порция данных.

public abstract void closeO throws IOException

Закрывает ранее открытый поток чтения. Метод используется для высвобождения ресурсов, связанных с потоком (таких как дескрипторы открытых файлов). Любые попытки обращения к закрытому потоку приводят к выбрасыванию исключения типа IOException, но повторное закрытие потока эффектов не вызывает.

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

  Между  классами   Reader   и   inputStream   существует   ряд   различий. Reader   базовым   абстрактным   методом   чтения   является   вариант   метода read, осуществляющий чтение в массив типа char, а остальные версии основываются на базовой. В классе InputStream в качестве основного объявле метод   read,   выполняющий   ввод   одного   байта.   Классы,   производные Reader, обязаны предоставить реализацию абстрактного метода close — отличие от наследования пустой реализации;  многим классам потоков,  к правило, необходимо "знать", был ли закрыт поток или нет, так что метод

close обычно подлежит переопределению. Наконец, в классе InputStream предусмотрен метод available, позволяющий выяснить, какой объем данных готов для ввода, а класс Reader предоставляет метод ready, свидетельствующий о том, существуют ли такие данные или нет.

  В качестве примера приведем программу, выполняющую подсчет общего количества символов и числа знаков пробела в символьном потоке чтения:

import java.io.*;

class countspace {

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

{

     Reader in;

      if (args.length == 0)

          in = new inputStreamReader(System.in);

     else

          in = new FileReader(args[O]);

int ch;

int total;

int spaces =0;

for  (total  =0;   (ch = in.readO)   != -1;   total++)

      if (Character.iswhitespace((char)  ch))

      spaces++;

}

 

System.out.println(total  +”символов,”

  + spaces + "  пробелов");

  }

}

 

Программа принимает имя файла в виде параметра командной строки. Переменная in представляет символьный поток чтения. Если имя файла не задано, используется стандартный поток ввода, System, in, после "вложения" его в объект типа InputStreamReader, выполняющий преобразование байтового потока ввода в символьный поток чтения; в противном случае создается объект типа FileReader, расширяющего класс Reader.

  В цикле for подсчитывается общее количество символов в файле; кроме того, с помощью метода iswhitespace класса Character выявляются символы пробела и вычисляется их количество, а затем на экран выводится результат. Так выглядит итог работы программы, которой в качестве параметра передано имя Файла с ее же исходным текстом:

477 символов,   130  пробелов.

 

Writer в Java

 Абстрактный класс Writer обеспечивает поддержку символьного потока записи аналогично тому, как это делает OutputStream, реализующий модель байтового потока вывода, и многие методы Writer схожи с теми, которые объявле-в составе OutputStream; помимо этого, в классе Writer предусмотрены не-Оторые другие полезные версии метода write.

 

public void write(int ch)  throws  lOException

Записывает ch в виде символа. Символ передается как значение i nt, но записывается только 16 битов последнего. Метод выполняет блокировку д0 тех пор, пока символ не записан.

public abstract void write(char[]   buf,   int offset,   int count)

  throws lOException

Записывает     count     символов     массива     buf,     начиная     с     элемента

buf [offset]. Метод выполняет блокировку до тех пор, пока символы не  записаны.

public void write(char[]   buf)  throws  lOException

Метод     аналогичен     предыдущему     при     условии     write (buf,       О,

buf.length).

public void write(String str,   int offset,   int count) throws lOException

Записывает      count      символов      строки      Str,      начиная      с      символа str.charAt(offset).

 public void write(String str) throws  lOException

   Метод      аналогичен     предыдущему     при     ‘условии     write(str,       0, str .length()). public abstract void flush()  throws  lOException

Осуществляет сброс (flush) потока. Если поток сохраняет в промежуточном буфере некоторое число символов, переданных методами write различных версий, flush провоцирует выполнение операции непосредственной записи данных в объект-получатель. Затем, если получателем является другой поток, тот в свою очередь также сбрасывается. Таким образом, единственный вызов flush приводит к сбросу всех буферов в цепочке взаимосвязанных потоков. Если поток не относится к категории буферизованных, никакие действия не выполняются.

 public abstract void close()  throws lOException

Закрывает ранее открытый поток  записи,  выполняя  при необходимости его сброс. Метод используется для высвобождения ресурсов, связанных с потоком (таких как дескрипторы открытых файлов). Любые попытки обращения к закрытому потоку приводят к выбрасыванию исключения типа lOException, но повторное закрытие потока эффектов не вызывает.

  Классы, производные от Writer, обязаны обеспечить реализацию варианта метода write, связанного с записью символов из части массива, а также методов close и flush. Все остальные методы Writer основаны на трех методах, названных выше. Это отличает Writer от класса OutputStream, в котором в качестве базового метода вывода предусмотрен вариант write, осуществляющий вывод одного байта, а для методов flush и close предложены реализации по умолчанию.  Как и в случ класса Reader, производительность операций может быть улучшена за счет переоп ределения в производных классах и других методов.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии