Как считать данные из файла java inputstreamreader

Обновлено: 06.07.2024

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

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

  1. Поток ввода файла – Чтение файла
  2. Поток ввода файла – Оставшиеся байты
  3. Поток ввода файлов – Более высокая производительность
  4. Поток ввода файла против потока ввода буфера
  5. InputStreamReader – Преобразование потока ввода файла в средство чтения
  6. FileInputStream – Чтение файла в Юникоде

В этом примере используется FileInputStream для чтения байтов из файла и распечатки содержимого. fis.read() считывает байт за раз, и он вернет -1 если он достиг конца файла.

Мы можем использовать fis.available() для проверки оставшихся байтов, которые можно прочитать. Например:

Ниже приведен текстовый файл, содержащий 10 байт.

Для файла, содержащего файл размером 10 байт, first.read() будет выполняться десять раз и каждый раз считывать байт. (Видите здесь проблему?)

3. Поток ввода файлов – Более высокая производительность

3.2 Мы можем использовать чтение(байт b[]) для чтения предопределенных байтов в массив байтов; это значительно увеличит производительность чтения.

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

Примечание Например, если файл, содержащий 81920 байт (80 кб), значение по умолчанию .read потребует 81920 собственных вызовов для чтения всех байтов из файла; В то время как fis.read(байт) (для размера 8192) нам нужно всего 10 собственных вызовов. Разница огромна.

4. Поток ввода файла против потока ввода буфера

Поток FileInputStream считывает байт за раз, и каждый read() будет собственным считыванием с диска. Для чтения большого файла это замедлится.

Обычная практика использует BufferedInputStream для обертывания FileInputStream для обеспечения буферного кэша для повышения производительности чтения.

5. Преобразуйте поток ввода файла для чтения

В этом примере показано, как преобразовать FileInputStream в BufferedReader и прочитать его построчно.

В этом примере используется FileInputStream для чтения файла Unicode . Например:

Файл Юникода, содержащий несколько китайских символов, и каждый кодовый символ Юникода содержит два или более байта.

Мы можем использовать приведенный выше пример 3, чтобы прочитать файл Юникода и правильно распечатать их.

Кроме того, мы также можем использовать пример 5 InputStreamReader для чтения и печати файла Юникода, по умолчанию InputStreamReader имеет кодировку UTF-8 по умолчанию.

А как это вообще работает?

    — одна из лекций JavaRush, посвященная BufferedReader и InputStreamReader — документация Oracle о классах BufferedReader и InputStreamReader .

ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ

Ох, небеса. наконец-то понятная статья. Не даром говорят, кто ясно мыслит, тот ясно излагает! Готова расцеловать автора.

Классно всё объяснено. Почти всё понятно, как кажется :)

В лекции пишется InputStreamReader умеет и считывать данные, и конвертировать байты в символы Но примера с конвертацией в символ не привели почему- то, кто может подсказать, как это делается?


IntelliJ IDEA: File -> Settings -> Editor -> Live Templates. Выбираем Java, жмём на "+". Добавляем: Abbreviation - buf Template text - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); Applicable in Java - Statement Теперь при наборе в коде buf и нажатии tab или enter, шаблон buf будет развёрнут в И запоминать не нужно, и время сэкономит ;)

Знаю что это очевидно. Но пока понять не могу. В чем преимущество у BufferedReader перед Scanner На мой взгляд Scanner удобнее, короче и понятнее, меньше зависимости в классах. Плюс он выглядит таким образом: Scanner scannerVar = new Scanner(System.in); int numbVar = scannerVar.nextInt(); //тут еще и методы отличаются если я правильно их называю Как выглядит такой же рабочий BufferedReader: /*Может у него больше применений или чего то что для меня остается загадкой*/ BufferedReader readerVar = new BufferedReader(new InputStreamReader(System.in)); //оч длинно int numbVar = readerVar.readInt(); //тут int что ли нет? Только стринг? Опять таки у первого варианта можно выбирать любой тип переменной. Пожалуйста опытные коллеги объясните в чем разница и преимущества. Спасибо.

Народ, кто читает статью в начале первого квеста - расслабьтесь! 🙂 Просто запомните эту конструкцию или запишите куда-нибудь, чтобы копировать и вставлять. Этого будет достаточно. Гораздо хуже сейчас пытаться вникнуть, ничего не понять и так запариться, что сами у себя отобьёте желание учиться Подробное понимание, как оно работает, вам понадобится в конце 18го уровня.

Работа с консолью в Java. Классы InputStreamReader , PrintStream . Создание потока ввода/вывода связанного с консолью. Перенаправление потоков ввода/вывода в файл, из файла, из строки. Примеры

Содержание

  • 1. Создание потока ввода, связанного с консолью. Класс InputStreamReader
  • 2. Создание потока вывода, связанного с консолью. Класс PrintStream . Методы print() , println() . Пример
  • 3. Класс InputStreamReader . Чтение символов из консоли с помощью метода read() . Примеры
  • 4. Чтение символов из консоли с буферизацией. Классы InputStreamReader , BufferedStreamReader . Пример
  • 5. Запись данных, выводимых на консоль. Вывод массива вещественных чисел в консоль. Класс PrintStream . Пример
  • 6. Чтение строк из консоли с поддержкой буферизации и вывод их на экран. Классы InputStreamReader , BufferedStreamReader . Метод readLine() . Пример
  • 7. Чтение строк из консоли и запись их в файл. Классы InputStreamReader , BufferedReader , FileInputStream , PrintStream . Пример
  • 8. Чтение строк из символьного файла и вывод их на консоль. Класс FileReader . Пример
  • 9. Классы PrintStream , FileOutputStream . Перенаправление потока вывода из строки String в файл. Пример

Поиск на других ресурсах:

1. Создание потока ввода, связанного с консолью. Класс InputStreamReader

Поток ввода данных из консоли можно организовать одним из двух способов:

  • с помощью потока ввода байтов;
  • с помощью потока ввода символов. В этом случае данные, которые вводятся из консоли, считываются из стандартного потока ввода, которому соответствует переменная System.in из пакета java.lang . Иными словами, переменная System.in ссылается на стандартный поток ввода, которым, по умолчанию, считается клавиатура.

В языке Java для реализации операций ввода из консоли используется класс InputStreamReader . Этот класс есть подклассом абстрактного базового класса Reader и предназначен для конвертирования байт в символы.

Чтобы получить объект типа InputStreamReader нужно создать экземпляр этого типа по следующей общей форме

  • objStream – экземпляр, который связан с потоком ввода символов;
  • inputStream – поток ввода символов. В случае с консолью, этим потоком выступает переменная System.in .

Значит, для потока System.in , чтобы создать экземпляр (объект) типа InputStreamReader , нужно вызвать следующий конструктор

2. Создание потока вывода, связанного с консолью. Класс PrintStream . Методы print() , println() . Пример

В пакете java.lang реализованы две переменные, которые связаны с потоком записи данных на консоль:

  • System.out . Эта переменная соответствует потоку вывода на консоль;
  • System.err . Эта переменная связана с потоком вывода ошибок.

Для работы с выводом на консоль разработан специальный класс PrintStream , который есть производным от класса OutputStream . В этом классе основными являются методы print() и println() .

Чтобы создать поток вывода, связанный с консолью, нужно объявить экземпляр класса PrintStream . При создании экземпляра нужно связать его с соответствующим потоком как показано в следующем примере

Результат выполнения программы

3. Класс InputStreamReader . Чтение символов из консоли с помощью метода read() . Примеры

Как известно, с консолью связана стандартная переменная System.in . Чтобы прочитать символы из консоли без буферизации можно использовать возможности класса InputStreamReader . Класс InputStreamReader есть подклассом абстрактного класса Reader . Класс InputStreamReader предназначен для конвертирования байт в символы.

Основным методом класса InputStreamReader есть метод read() , который имеет две перегруженные реализации. Первая реализация имеет следующую общую форму

В этом случае метод возвращает код введенного символа из консоли.

Общая форма второй реализации метода следующая

Здесь метод заполняет массив ac типа char[] введенными значениями символов из консоли. Параметр count задает количество символов, которые нужно вставить в массив ac . Для массива ac предварительно может быть выделена память. Второй вариант метода возвращает количество символов, которые могут быть прочитаны.

Пример 2. Использование метода read() , который обрабатывает массив типа char[] .

  • поток_чтения_введенных_данных – некоторый поток данных (файл, консоль и т.п.). В случае консоли здесь задается экземпляр класса InputStreamReader (смотрите предыдущий пункт).

Такой подход реализует паттерн Декоратор (Decorator). В паттерне Декоратор экземпляр одного класса служит оболочкой для экземпляра другого класса. Таким образом происходит наслаивание объектов.

Ниже приведен пример функции ReadConsoleBuf() , которая реализует чтение символов из консоли с буферизацией.

5. Запись данных, выводимых на консоль. Вывод массива вещественных чисел в консоль. Класс PrintStream . Пример

Пример есть демонстрационным. Вывод происходит в экземпляр класса PrintStream , который связан с консолью (переменной System.out ).

6. Чтение строк из консоли с поддержкой буферизации и вывод их на экран. Классы InputStreamReader , BufferedStreamReader . Метод readLine() . Пример

Читать строки из консоли можно используя буферизацию или без нее. Если используется механизм буферизации, то класс InputStreamReader помещается в конструктор класса BufferedReader .

Чтение одной строки осуществляется с помощью функции readLine() .

Результат выполнения программы:

7. Чтение строк из консоли и запись их в файл. Классы InputStreamReader , BufferedReader , FileInputStream , PrintStream . Пример

В примере продемонстрировано перенаправление ввода с консоли в текстовый файл.

Результат выполнения программы:

8. Чтение строк из символьного файла и вывод их на консоль. Класс FileReader . Пример

Пусть задан символьный (текстовый) файл, который нужно вывести на консоль. Чтение строк из файла можно реализовать с помощью метода read() класса FileReader . Строка из файла читается в заведомо выделенный участок памяти – буфер.

Чтобы определить конец файла нужно использовать метод ready() класса FileReader . Если конец файла, то метод возвращает false .

9. Классы PrintStream , FileOutputStream . Перенаправление потока вывода из строки String в файл. Пример

Пусть задана некоторая строка типа String . Нужно записать эту строку в файл путем использования перенаправления потока вывода в файл.

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

  • создать экземпляр класса FileOutputStream с именем файла, в который будет осуществляться запись строки;
  • создать экземпляр класса PrintStream , в конструктор которого поместить созданный экземпляр класса FileOutputStream ;
  • использовать один из методов print() или println() для записи строки в файл.

Фрагмент программного кода, осуществляющего перенаправление потока вывода из строки в файл, следующий

По данному примеру можно реализовать функцию, которая записывает массив строк в файл.

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

Иерархия InputStream

Поток Stream- это абстрактное понятие источника или приёмника данных, которые способны обрабатывать информацию. Есть два типа потоков: байтовые и символьные. В некоторых ситуациях символьные потоки более эффективны, чем байтовые. Классы, производные от базовых InputStream или Reader, имеют методы read() для чтения отдельных байтов или массива байтов.

Базовый класс InputStream - это абстрактный класс, определяющий входной поток данных, и является родителем для классов, получающих данные из различных источников : массив байтов, строки (String), файлы, каналы pipe, у которых одна из сторон является входом, а вторая сторона играет роль выхода, и т.д. Методы класса InputStream при возникновении ошибки вызывают исключение IOException.

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

МетодОписание
int read() возвращает очередной доступный символ во входном потоке в виде целого
int read(byte b[]) чтение b.length байтов из входного потока в массив b. Возвращает количество прочитанных из потока байтов
int read(byte b[], int off, int len) чтение len байтов в массиве b, начиная со смещения off. Возвращает количество реально прочитанных байтов
long skip(long n) пропуск во входном потоке n байтов. Возвращает количество пропущенных байтов
int available() получение количество доступных для чтения байтов
void close() закрытие источник ввода. Последующие попытки чтения из этого потока вызывают IOException
void mark(int readlimit) установка метки в текущей позиции входного потока, которую можно будет использовать до тех пор, пока из потока не будет прочитано readlimit байтов
void reset() перевод указателя потока на установленную ранее метку
boolean markSupported() проверка поддержки потоком операции mark/reset

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

ByteArrayInputStream

Класс ByteArrayInputStream использует байтовый массив в качестве источника данных. Он имеет следующие конструкторы :

В качестве параметров конструкторы ByteArrayInputStream используют массив байтов buf для чтения, смещение относительно начала массива offset и количество считываемых символов length.

Пример чтения массив байтов в консоль:

В отличие от других классов потоков для закрытия объекта ByteArrayInputStream не требует вызывать метод close.

FileInputStream

FileInputStream - основной класс из данной иерархии для работы с файлами. Имеет два основных конструктора.

Подробно FileInputStream описан на странице Файлы и директории

FilterInputStream

FilterInputStream - абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства. FilterInputStream является базовым классом для двух других классов. Его единственный конструктор требует передачи в качестве параметра объекта класса InputStream, т.е. фактически объекта некоторого неабстрактного класса, порожденного от InputStream.

Прямое использование FilterInputStream в программе нецелесообразно.

BufferedInputStream

BufferedInputStream служит для организации более эффективного "буферизованного" ввода данных. Буферизация ввода-вывода является удобным способом оптимизации производительности, позволяя заключить в оболочку любой поток класса InputStream.

В конструкторе класса BufferedInputStream необходимо передать InputStream. В данном случае таким объектом является экземпляр класса ByteArrayInputStream.

Как и все потоки ввода BufferedInputStream обладает методом read(), который считывает данные с помощью метода read из массива buffer.

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

DataInputStream

Для чтения байтовых данных (не строк) применяется класс DataInputStream. В этом случае необходимо использовать классы из группы InputStream. Для преобразования строки в массив байтов, пригодный для помещения в поток ByteArrayInputStream, в классе String предусмотрен метод getBytes(). Полученный ByteArrayInputStream представляет собой поток InputStream, подходящий для передачи DataInputStream.

При побайтовом чтении символов из форматированного потока DataInputStream методом readByte() любое полученное значение будет считаться действительным, поэтому возвращаемое значение неприменимо для идентификации конца потока. Вместо этого можно использовать метод available(), который сообщает, сколько еще осталось символов.

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

Конструктор класса DataInputStream:

Методы DataInputStream

МетодОписание
boolean readBoolean() байт булевого однобайтового значения
byte readByte() байт одного байта
char readChar() байт значения char
double readDouble() байт восьмибайтового значения double
float readFloat() чтение четырехбайтового значения float
int readInt() чтение целочисленного значения int
long readLong() чтение значения long
short readShort() чтение значения short
String readUTF() чтение строки в кодировке UTF-8
int skipBytes(int n) пропуск при чтении n байтов

Пример чтения из бинарного файла с использованием DataInputStream

ObjectInputStream

Класс ObjectInputStream отвечает за чтение ранее сериализованных данных из потока. В конструкторе он принимает ссылку на поток ввода:

Основные методы класса ObjectInputStream :

МетодОписание
int read() чтение одного байта; возвращает его целочисленное представление
boolean readBoolean() чтение одного значения boolean
byte readByte() чтение одного байта
char readChar() чтение одного символ char
double readDouble() чтение значения типа double
float readFloat() чтение значения типа float
int readInt() чтение целочисленного значения int
long readLong() чтение значения типа long
short readShort() чтение значения типа short
String readUTF() чтение строки в кодировке UTF-8
Object readObject() чтение объекта
int skipBytes(int len) пропуск при чтении нескольких байт, количество которых равно len
int available() чтение количества доступных для чтения байт
void close() закрытие потока

Пример чтения объекта Person из файла :

Класс PipedInputStream

Класс PipedInputStream - это специальный класс, используемый для связи отдельных программ (потоков) друг с другом внутри одной JVM. Данный класс является важным инструментом организации синхронизации потоков.

Читайте также: