Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Класс reader java

Потоки Reader и Writer

Абстрактные классы Reader и Writer являются символьными потоками.

Абстрактный класс Reader

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

Методы класса Reader

МетодОписание
abstract void close() throws IOExceptionЗакрытие ранее открытого потока чтения. Метод используется для высвобождения ресурсов, связанных с потоком (таких как дескрипторы открытых файлов). Любые попытки обращения к закрытому потоку приводят к выбрасыванию исключения типа IOException, но повторное закрытие потока эффектов не вызывает.
void mark(int limit)Размещение метки в текущей позиции входного потока
boolean markSupported()Функция проверки поддержки потоком методов mark() и reset()
boolean ready()Функция проверки готовности объекта для чтения данных, т.е. в нем существует хотя бы один доступный символ. Следует заметить, что результат, равный false, отнюдь не свидетельствует о том, что очередной вызов read приведет к возникновению блокировки, поскольку в промежутке между обращениями к ready и read в поток может поступить очередная порция данных.
void reset()Сброс указателя ввода в ранее установленную позицию метки.
long skip(long count)Функция пропуска указанного в параметре count количества символов ввода. Возвращает количество действительно пропущенных символов. Значение count не должно быть отрицательным.
int read() throws lOExceptionЧтение одного символа данных в виде целого числа в диапазоне от 0 до 65535. Если символов, готовых для чтения, нет ввиду достижения конца потока, то возвращается значение -1. Метод выполняет блокировку до тех пор, пока имеются доступные для чтения символы, не достигнут конец потока либо не выброшено исключение.
abstract int read(char[] buf, int offset, int count) throws lOExceptionЧтение символов и сохранение их в массиве buf типа char. Максимальное количество читаемых символов определяется значением count. Символы записываются в массив, начиная с смещение offset. Содержимое всех остальных элементов массива buf остается неизменным. Метод возвращает количество фактически считанных символов.
Если достигнут конец потока и не считан ни один символ, возвращается -1. Если значение count равно нулю, чтение не производится и возвращается 0.
Метод выполняет блокировку до тех пор, пока имеются доступные для чтения символы не достигнут конец потока либо не выброшено исключение.
int read(char[] buf) throws IOExceptionМетод аналогичен предыдущему при условии, offset = 0, count = buf.length.

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

Наследники класса Reader

  • BufferedReader — буферизированный входной символьный поток; увеличивает производительность за счёт буферизации ввода;
  • CharArrayReader — входной поток чтения символьного массива;
  • FileReader — входной поток чтения содержимого файла; в конструкторе класса нужно указать либо путь к файлу, либо объект типа File;
  • FilterReader — фильтрующий читатель;
  • InputStreamReader — входной поток, транслирующий байты в символы;
  • LineNumberReader — входной поток, подсчитывающий строки;
  • PipedReader — входной канал;
  • PushbackReader — входной поток, позволяющий возвращать символы обратно в поток;
  • StringReader — входной поток, читающий из строки.

Класс BufferedReader

Широкораспространенный в использовании класс BufferedReader считывает текст из символьного потока ввода, буферизируя прочитанные символы. Использование буфера призвано увеличить производительность чтения данных из потока.

BufferedReader имеет следующие конструкторы :

Примеры BufferedReader

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

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

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

Абстрактный класс Writer

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

Методы класса Writer

Все методы класса вызывают исключение IOException при возникновении ошибки.

МетодОписание
append(char c)Добавление символа в конец вызывающего выходного потока.
abstract void close() throws lOExceptionЗакрытие ранее открытого поток записи; при необходимости выполняется сброс потока. Метод используется для высвобождения ресурсов, связанных с потоком (таких как дескрипторы открытых файлов). Любые попытки обращения к закрытому потоку приводят к выбрасыванию исключения типа lOException, но повторное закрытие потока эффектов не вызывает.
abstract void flush()Сброс потока. Если поток сохраняет в промежуточном буфере некоторое число символов, переданных методами write различных версий, flush провоцирует выполнение операции непосредственной записи данных в объект-получатель. Затем, если получателем является другой поток, тот в свою очередь также сбрасывается. Таким образом, единственный вызов flush приводит к сбросу всех буферов в цепочке взаимосвязанных потоков. Если поток не относится к категории буферизованных, никакие действия не выполняются.
void write(int char) throws lOExceptionЗапись символа в выходной поток. Метод выполняет блокировку потока до тех пор, пока символ не будет записан.
abstract void write(char[] buf, int offset, int count) throws lOExceptionЗапись count символов массива buf, начиная с элемента buf [offset]. Метод выполняет блокировку до тех пор, пока символы не будут записаны.
void write(char[] buf) throws lOExceptionМетод аналогичен предыдущему при условии offset = 0 и count = buf.length.
void write(String string, int offset, int count) throws lOExceptionЗапись count символов строки string, начиная с символа string.charAt(offset).
void write(String string) throws lOExceptionМетод аналогичен предыдущему при условии offset = 0 и count = string.length()).
Читать еще:  Java lang illegalstateexception already tesselating

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

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

Наследники класса Writer

  • BufferedWriter — буферизированный выходной символьный поток; позволяет повысить производительность за счёт снижения количества операций физической записи в выходное устройство;
  • CharArrayWriter — выходной поток, который пишет в символьный массив;
  • FileWriter — выходной поток, пишущий в файл; в конструкторе можно определить вывод в конец файла. Создание объекта не зависит от наличия файла, он будет создан в случае необходимости. Если файл существует и он доступен только для чтения, то передаётся исключение IOException
  • FilterWriter — фильтрующий писатель
  • OutputStreamWriter -выходной поток, транслирующий байты в символы
  • PipedWriter — выходной канал
  • PrintWriter — выходной поток, включающий методы print() и println()
  • StringWriter — выходной поток, пишущий в строку

Класс BufferedWriter

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

BufferedWriter имеет следующие конструкторы :

В качестве параметра out конструктор BufferedWriter принимает поток вывода, в который надо осуществить запись. Второй параметр size указывает на размер буфера.

Пример использования классов FileWriter и BufferedWriter :

Классы символьных потоков

1. Класс Reader

Класс Reader — абстрактный класс, определяющий символьный потоковый ввод. В случае ошибок все методы класса передают исключение IOException.

Методы класса Reader:

Существует 3 основных read()-метода:

  • int read()— возвращает представление очередного доступного символа во входном потоке в виде целого числа.
  • int read(char[] buffer)— пытается прочесть максимум buffer.length символов из входного потока в массив buffer. Возвращает количество символов, в действительности прочитанных из потока.
  • int read(char[] buffer, int offset, int length)— пытается прочесть максимум length символов, расположив их в массиве buffer, начиная с элемента offset. Возвращает количество реально прочитанных символов.
  • close() – метод закрывает поток.

2. Класс Writer

Класс Writer — абстрактный класс, определяющий символьный потоковый вывод. В случае ошибок все методы класса передают исключение IOException.

Методы класса Writer:

Существуют 5 основных write()-метода:

  • void write(int c) – записывает один символ в поток.
  • void write(char[] buffer) – записывает массив символов в поток.
  • void write(char[] buffer, int offset, int length) – записывает в поток подмассив символов длиной length, начиная с позиции offset.
  • void write(String aString)– записывает строку в поток.
  • void write(String aString, int offset, int length) – записывает в поток подстроку символов длиной length, начиная с позиции offset.

3. Класс FileWriter

Класс FileWriter создаёт объект класса, производного от класса Writer, который вы можете применять для записи файла. Создание объекта не зависит от наличия файла, он будет создан в случае необходимости. Если файл существует и он доступен только для чтения, то передаётся исключение IOException.

4. Класс FileReader

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

Пример 1. Использование FileWriter и FileReader

5. Класс BufferedWriter

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

По сравнению с классом FileWriter, BufferedWriter записывает относительно большие куски данных в файл, минимизируя количество обращений к файлу. Другими словами операции проходят быстрее.

Добавляет метод void newLine().

Конструкторы класса BufferedWriter:

В качестве параметра он принимает поток вывода, в который надо осуществить запись. Второй параметр указывает на размер буфера.

Читать еще:  Как написать игру на javascript

Пример 2. Использование класса BufferedWriter

6. Класс BufferedReader

Класс BufferedReader считывает текст из символьного потока ввода, буферизируя прочитанные символы. Использование буфера призвано увеличить производительность чтения данных из потока.

Добавляет метод String readLine().

Конструкторы класса BufferedReader:

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

Пример 3. Использование класса BufferedReader

7. Класс PrintWriter

Класс PrintWriter расширяет класс Writer. Содержит методы для форматирования.

Конструкторы класса PrintWriter:

  • PrintWriter(File file) — автоматически добавляет информацию в указанный файл.
  • PrintWriter(String fileName) — автоматически добавляет информацию в файл по указанному имени.
  • PrintWriter(OutputStream out) — для вывода информации используется существующий объект OutputStream, автоматически сбрасывая в него данные.
  • PrintWriter(Writer out) — для вывода информации используется существующий объект Writer, в который автоматически идет запись данных.

Методы класса PrintWriter:

  • println() — вывод строковой информации с переводом строки.
  • print() — вывод строковой информации без перевода строки.
  • printf()— форматированный вывод.
  • format() — форматированный вывод.

Пример 4. Использование класса PrintWriter

8. Классы символьных потоков

Класс

Назначение

BufferedReader

Буферизованный входной символьный поток.

BufferedWriter

Буферизованный выходной символьный поток.

CharArrayReader

Входной поток, который читает из символьного массива.

CharArrayWriter

Выходной поток, который пишет в символьный массив.

FileReader

Входной поток, читающий файл.

FileWriter

Выходной поток, пишущий в файл.

FilterReader

FilterWriter

InputStreamReader

Входной поток, транслирующий байты в символы.

LineNumberReader

Входной поток, подсчитывающий строки.

OutputStreamWriter

Выходной поток, транслирующий байты в символы.

PipedReader

PipedWriter

PrintWriter

Выходной поток, включающий print() и println().

PushbackReader

Входной поток, позволяющий возвращать символы обратно в поток.

Reader

Абстрактный класс, описывающий символьный ввод.

StringReader

Входной поток, читающий из строки.

StringWriter

Выходной поток, пишущий в строку.

Writer

Абстрактный класс, описывающий символьный вывод.

Java.io.Reader класс в Java

Это абстрактный класс для чтения символьных потоков. Единственные методы, которые должен реализовывать подкласс, это read (char [], int, int) и close (). Однако большинство подклассов переопределяют некоторые из методов, определенных здесь, чтобы обеспечить более высокую эффективность, дополнительную функциональность или оба.
Конструкторы:

  • protected Reader (): Создает новый читатель потока символов, критические секции которого синхронизируются на самом читателе.
  • protected Reader (Object lock): Создает новое устройство чтения символьного потока, критические секции которого будут синхронизироваться с данным объектом.

Методы:

  • abstract void close (): закрывает поток и освобождает любые системные ресурсы, связанные с ним. Как только поток будет закрыт, дальнейшие вызовы read (), ready (), mark (), reset () или skip () вызовут IOException. Закрытие ранее закрытого потока не имеет никакого эффекта.
  • void mark (int readAheadLimit): отмечает текущую позицию в потоке. Последующие вызовы reset () будут пытаться переместить поток в эту точку. Не все потоки ввода символов поддерживают операцию mark ().
  • boolean markSupported (): сообщает, поддерживает ли этот поток операцию mark (). Реализация по умолчанию всегда возвращает false. Подклассы должны переопределить этот метод.
  • int read (): читает один символ. Этот метод будет блокироваться до тех пор, пока символ не станет доступным, не произойдет ошибка ввода-вывода или не будет достигнут конец потока.
    Подклассы, которые намереваются поддерживать эффективный односимвольный ввод, должны переопределить этот метод.
  • int read (char [] cbuf): читает символы в массив. Этот метод будет блокировать, пока не будет доступен какой-либо ввод, не произойдет ошибка ввода-вывода или не будет достигнут конец потока.
  • abstract int read (char [] cbuf, int off, int len): считывает символы в часть массива. Этот метод блокирует, пока не будет доступен какой-либо ввод, не произойдет ошибка ввода-вывода или не будет достигнут конец потока ,
  • int read (CharBuffer target): Пытается прочитать символы в указанном буфере символов. Буфер используется как хранилище символов как есть: единственные сделанные изменения — это результаты операции put. Переворот или перемотка буфера не выполняются.
  • boolean ready (): сообщает, готов ли этот поток для чтения.
  • void reset (): Сбрасывает поток. Если поток был помечен, попытайтесь изменить его положение на отметке. Если поток не был отмечен, попытайтесь сбросить его каким-либо образом, соответствующим конкретному потоку, например, переместив его в начальную точку. Не все потоки ввода символов поддерживают операцию сброса (), а некоторые поддерживают сброс () без поддержки метки ().
  • long skip (long n): пропускает символы. Этот метод блокируется, пока не будут доступны некоторые символы, не произойдет ошибка ввода-вывода или не будет достигнут конец потока.

// Java-программа, демонстрирующая методы Reader

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

Потоки ввода-вывода. Работа с файлами

Потоки ввода-вывода

Отличительной чертой многих языков программирования является работа с файлами и потоками. В Java основной функционал работы с потоками сосредоточен в классах из пакета java.io .

Ключевым понятием здесь является понятие потока . Хотя понятие «поток» в программировании довольно перегружено и может обозначать множество различных концепций. В данном случае применительно к работе с файлами и вводом-выводом мы будем говорить о потоке (stream), как об абстракции, которая используется для чтения или записи информации (файлов, сокетов, текста консоли и т.д.).

Читать еще:  Int tostring java

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

Объект, из которого можно считать данные, называется потоком ввода , а объект, в который можно записывать данные, — потоком вывода . Например, если надо считать содержание файла, то применяется поток ввода, а если надо записать в файл — то поток вывода.

В основе всех классов, управляющих потоками байтов, находятся два абстрактных класса: InputStream (представляющий потоки ввода) и OutputStream (представляющий потоки вывода)

Но поскольку работать с байтами не очень удобно, то для работы с потоками символов были добавлены абстрактные классы Reader (для чтения потоков символов) и Writer (для записи потоков символов).

Все остальные классы, работающие с потоками, являются наследниками этих абстрактных классов. Основные классы потоков:

Потоки байтов

Класс InputStream

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

int available() : возвращает количество байтов, доступных для чтения в потоке

void close() : закрывает поток

int read() : возвращает целочисленное представление следующего байта в потоке. Когда в потоке не останется доступных для чтения байтов, данный метод возвратит число -1

int read(byte[] buffer) : считывает байты из потока в массив buffer. После чтения возвращает число считанных байтов. Если ни одного байта не было считано, то возвращается число -1

int read(byte[] buffer, int offset, int length) : считывает некоторое количество байтов, равное length, из потока в массив buffer. При этом считанные байты помещаются в массиве, начиная со смещения offset, то есть с элемента buffer[offset] . Метод возвращает число успешно прочитанных байтов.

long skip(long number) : пропускает в потоке при чтении некоторое количество байт, которое равно number

Класс OutputStream

Класс OutputStream является базовым классом для всех классов, которые работают с бинарными потоками записи. Свою функциональность он реализует через следующие методы:

void close() : закрывает поток

void flush() : очищает буфер вывода, записывая все его содержимое

void write(int b) : записывает в выходной поток один байт, который представлен целочисленным параметром b

void write(byte[] buffer) : записывает в выходной поток массив байтов buffer.

void write(byte[] buffer, int offset, int length) : записывает в выходной поток некоторое число байтов, равное length , из массива buffer , начиная со смещения offset , то есть с элемента buffer[offset] .

Абстрактные классы Reader и Writer

Абстрактный класс Reader предоставляет функционал для чтения текстовой информации. Рассмотрим его основные методы:

absract void close() : закрывает поток ввода

int read() : возвращает целочисленное представление следующего символа в потоке. Если таких символов нет, и достигнут конец файла, то возвращается число -1

int read(char[] buffer) : считывает в массив buffer из потока символы, количество которых равно длине массива buffer. Возвращает количество успешно считанных символов. При достижении конца файла возвращает -1

int read(CharBuffer buffer) : считывает в объект CharBuffer из потока символы. Возвращает количество успешно считанных символов. При достижении конца файла возвращает -1

absract int read(char[] buffer, int offset, int count) : считывает в массив buffer, начиная со смещения offset, из потока символы, количество которых равно count

long skip(long count) : пропускает количество символов, равное count. Возвращает число успешно пропущенных символов

Класс Writer определяет функционал для всех символьных потоков вывода. Его основные методы:

Writer append(char c) : добавляет в конец выходного потока символ c. Возвращает объект Writer

Writer append(CharSequence chars) : добавляет в конец выходного потока набор символов chars. Возвращает объект Writer

abstract void close() : закрывает поток

abstract void flush() : очищает буферы потока

void write(int c) : записывает в поток один символ, который имеет целочисленное представление

void write(char[] buffer) : записывает в поток массив символов

absract void write(char[] buffer, int off, int len) : записывает в поток только несколько символов из массива buffer. Причем количество символов равно len, а отбор символов из массива начинается с индекса off

void write(String str) : записывает в поток строку

void write(String str, int off, int len) : записывает в поток из строки некоторое количество символов, которое равно len, причем отбор символов из строки начинается с индекса off

Функционал, описанный классами Reader и Writer, наследуется непосредственно классами символьных потоков, в частности классами FileReader и FileWriter соответственно, предназначенными для работы с текстовыми файлами.

Теперь рассмотрим конкретные классы потоков.

Ссылка на основную публикацию
Adblock
detector