Класс Java InputStreamReader часто используется для чтения символов из файлов(или сетевых соединений), где байты представляют текст. В этом руководстве по Java мы узнаем о классе InputStreamReader, его создании и инициализации, а также о его методах, которые помогают в чтении данных из источника.
1. Класс InputStreamReader
- Он действует как мост между потоком байтов и потоком символов. Используя InputStreamReader, мы можем прочитать любой файл в байтах и преобразовать байты в символы нужной кодировки.
- Является частью пакета java.io.
- Он расширяет абстрактный класс Reader.
- Он реализует интерфейсы Closeable, AutoCloseable и Readable.
- Он предоставляет методы для чтения символов из потока.
2. Создание InputStreamReader
Как упоминалось ранее, InputStreamReader считывает файл, используя поток байтов и преобразует его в поток символов. Это означает, что нам нужно сначала создать InputStream, а затем использовать этот Reader для считывания символов из потока.
В приведенном ниже примере InputStreamReader будет считывать символы из входного потока fis, который, в свою очередь, считывает байты из файла data.txt.
Задавать информацию о наборе символов необязательно. В этом случае будет использоваться набор символов системы по умолчанию.
String file = "c:\temp\data.txt";// Creates an InputStreamFileInputStream fis = new FileInputStream(file);// Creates an InputStreamReaderInputStreamReader isr = new InputStreamReader(fis);
3. Установка кодировки символов
Если считанные из потока символы имеют другую кодировку, то передайте набору информацию о наборе символов в конструктор InputStreamReader.
String file = "c:\temp\data.txt";FileInputStream fis = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF8"));
4. Закрытие InputStreamReader
Вызовите метод inputStreamReader.close(), когда закончите чтение из потока. Или мы можем использовать функцию автоматического закрытия этого класса.
В приведенном примере функция try-with-resources автоматически закроет InputStreamReader и FileInputStream после полного выполнения блока try.
String file = "c:\temp\data.txt";try(InputStreamReader input= new InputStreamReader(new FileInputStream(file))) {//Perform operations}
5. Пример Java InputStreamReader
Давайте рассмотрим несколько примеров чтения файла с помощью InputStreamReader в Java. В каждом примере мы будем читать файл demo.txt.
hello world 1hello world 2hello world 3
Пример 1: Чтение файла с помощью InputStreamReader
В данном примере мы считываем все содержимое файла demo.txt в массив символов. Затем мы выводим считанные символы в стандартный вывод.
Эту технику следует использовать для небольших файлов. Также не забудьте создать достаточно большой массив символов, который может хранить все символы из файла.
Метод read(char[]) считывает символы в заданный массив. Этот метод будет блокироваться до тех пор, пока не будет доступен какой-либо ввод, не произойдет ошибка ввода-вывода или не будет достигнут конец потока.
import java.io.FileInputStream;import java.io.InputStreamReader;public class InputStreamReaderExample{public static void main(String[] args){// Creates an array of characterchar[] array = new char[50];try(InputStreamReader input= new InputStreamReader(new FileInputStream("demo.txt"))) {// Reads characters from the fileinput.read(array);System.out.println(array);}catch(Exception e) {e.getStackTrace();}}}
Вывод программы:
hello world 1hello world 2hello world 3
Пример 2: Java Чтение файла посимвольно с помощью InputStreamReader
В данном примере мы будем читать тот же файл, но по одному символу за раз. Это можно использовать и для чтения больших файлов.
import java.io.FileInputStream;import java.io.InputStreamReader;public class InputStreamReaderExample{public static void main(String[] args){try(InputStreamReader input= new InputStreamReader(new FileInputStream("demo.txt"))) {int data = input.read();while(data != -1){//Do something with data e.g. append to StringBufferSystem.out.print((char) data);data = input.read();}}catch(Exception e) {e.getStackTrace();}}}
Вывод программы:
hello world 1hello world 2hello world 3