Перейти к содержимому

Bufferedreader java что это

  • автор:

Bufferedreader java что это

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

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

BufferedWriter(Writer out) BufferedWriter(Writer out, int sz)

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

Например, осуществим запись в файл:

import java.io.*; public class Program < public static void main(String[] args) < try(BufferedWriter bw = new BufferedWriter(new FileWriter("notes4.txt"))) < String text = "Hello World!\nHey! Teachers! Leave the kids alone."; bw.write(text); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >

Чтение текста и BufferedReader

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

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

BufferedReader(Reader in) BufferedReader(Reader in, int sz)

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

Так как BufferedReader наследуется от класса Reader , то он может использовать все те методы для чтения из потока, которые определены в Reader. И также BufferedReader определяет свой собственный метод readLine() , который позволяет считывать из потока построчно.

Рассмотрим применение BufferedReader:

import java.io.*; public class Program < public static void main(String[] args) < try(BufferedReader br = new BufferedReader (new FileReader("notes4.txt"))) < // чтение посимвольно int c; while((c=br.read())!=-1)< System.out.print((char)c); >> catch(IOException ex) < System.out.println(ex.getMessage()); >> >

Также можно считать текст построчно:

try(BufferedReader br = new BufferedReader(new FileReader(«notes4.txt»))) < //чтение построчно String s; while((s=br.readLine())!=null)< System.out.println(s); >> catch(IOException ex)

Считывание с консоли в файл

Соединим оба класса BufferedReader и BufferedWriter для считывания с консоли в файл. Для этого определим следующий код программы:

import java.io.*; public class Program < public static void main(String[] args) < try(BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new FileWriter("notes5.txt"))) < // чтение построчно String text; while(!(text=br.readLine()).equals("ESC"))< bw.write(text + "\n"); bw.flush(); >> catch(IOException ex) < System.out.println(ex.getMessage()); >> >

Здесь объект BufferedReader устанавливается для чтения с консоли с помощью объекта new InputStreamReader(System.in) . В цикле while считывается введенный текст. И пока пользователь не введет строку «ESC», объект BufferedWriter будет записывать текст файл.

Как работает BufferedReader?

Я рассчитываю, что размер буфера будет равен 1. То есть когда программа попросит ввести данные и я введу например qwer , а потом нажму enter, буква q будет прочитана и её код запишется в x . После этого, так как это буферизованный поток, символы будут помещены в буфер, но так как я назначил его размер равным одному, то туда будет помещен лишь один символ — w. Следовательно в потоке остаётся еще 3 символа (e, r и enter) и код первого из них будет помещен в y . Но к удивлению, сколько бы символов я не вводил программа каждый раз просит меня ввести значения для переменной y . Почему? Как это работает?

Отслеживать
задан 29 мая 2022 в 13:20
VanechikSpace VanechikSpace
465 2 2 серебряных знака 9 9 бронзовых знаков

Это магия StreamDecoder-а внутри InputStreamReader. Если его просят считать 1 байт, то он запрашивает 2. А в запросе 2 байт в методе implRead фигурирует readBytes , которому всё равно на количество запрошенного, если оно меньше 8192 🙂

29 мая 2022 в 13:56
@kami а что такое это StreamDecoder ? Почему то про него в гугле нету информации
29 мая 2022 в 14:23

А я про него не гуглил, а по шагам прошелся по внутренностям qq.read(). Из BufferedReader выполнение уходит в InputStreamReader, а в нём — в StreamDecoder. Словом, BufferedReader ни при чём, он молодец и действительно читает 1 байт. Ну а что происходит в том, над чем он выступает оберткой — это уже не его зона ответственности.

29 мая 2022 в 14:26

@kami я извиняюсь за глупый вопрос, просто я новичок. А «прошелся по внутренностям» означает воспользовался отладчиком ?)

29 мая 2022 в 15:18

Да, именно отладчиком, благо IDE более чем способна генерировать исходники из скомпилированных файлов. Не знаю, как оформить результаты отладки ответом, чтобы это было понятно именно для начинания. Не последовательность же вызовов прикладывать, тем более что в зависимости от версии Java она может несколько отличаться.

Разница между FileReader и BufferedReader в Java

FileReader и BufferedReader — два класса, которые могут считывать символы из входного потока.

В этом туториале мы с вами рассмотрим различия между ними.

2. FileReader

Класс FileReader предназначен для чтения символьного потока из файла. К сожалению, он может читать файл только посимвольно, и каждый раз, когда мы вызываем его метод read() , он напрямую обращается к файлу на жестком диске, чтобы прочитать из него ровно один символ. В результате FileReader — очень медленный и неэффективный способ чтения символов из файлов. Кроме того, FileReader не может читать символы ни из каких типов потоков входных данных, кроме файлов.

2.1. Конструкторы

FileReader имеет три конструктора:

  • FileReader(File file) : получает в качестве аргумента экземпляр файла
  • FileReader(FileDescriptor fd) : получает в качестве аргумента дескриптор файла
  • FileReader(String fileName) : получает в качестве аргумента имя файла (включая его путь)
2.2. Что он возвращает

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

2.3. Пример

Давайте посмотрим на использование FileReader в коде примера, в котором мы будем считывать символы из текстового файла, содержащего всего одну строку “qwerty”:

@Test public void whenReadingAFile_thenReadsCharByChar() < StringBuilder result = new StringBuilder(); try (FileReader fr = new FileReader("src/test/resources/sampleText2.txt")) < int i = fr.read(); while(i != -1) < result.append((char)i); i = fr.read(); >> catch (IOException e) < e.printStackTrace(); >assertEquals("qwerty", result.toString()); >

В приведенном выше коде мы приводим возвращаемое значение из метода read() к типу char, а затем добавляем его в строку результата.

3. BufferedReader

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

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

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

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

3.1. Конструкторы

BufferedReader имеет два конструктора:

  • BufferedReader(Reader in) : в качестве аргумента получает поток символьных входных данных (который должен реализовывать абстрактный класс Reader )
  • BufferedReader(Reader in, int sz) : в качестве аргументов получает символьный поток и размер буфера
3.2. Что он возвращает

Если мы вызовем метод read() , он возвращает целое число, представляющее значение символа в формате Unicode, который был прочитан из входного потока. Более того, если мы вызовем метод readLine() , он считает сразу целую строку из буфера и вернет ее как string .

3.3. Пример

Давайте посмотрим на пример использования BufferedReader для чтения символов из текстового файла, содержащего три строки:

@Test public void whenReadingAFile_thenReadsLineByLine() < StringBuilder result = new StringBuilder(); try (BufferedReader br = new BufferedReader(new FileReader("src/test/resources/sampleText1.txt"))) < String line; while((line = br.readLine()) != null) < result.append(line); result.append('\n'); >> catch (IOException e) < e.printStackTrace(); >assertEquals("first line\nsecond line\nthird line\n", result.toString()); >

Приведенный выше тестовый код выполняется без ошибок, а это означает, что BufferedReader успешно читает все три строки текста из файла.

4. В чем разница?

BufferedReader гораздо быстрее и эффективнее, чем FileReader поскольку он считывает целый блок данных из входного потока и сохраняет его в буфере для дальнейших вызовов метода чтения, в то время как FileReader должен получать доступ к файлу для считывания каждого символа. Более того, FileReader может читать файл только посимвольно, в то время как BufferedReader имеет такие полезные методы, как readLine() , который может считать из буфера сразу целую строку. И наконец, FileReader может производить чтение только из файла, а BufferedReader может читать из любого типа потока символьных входных данных (файл, консоль, строка и т.д.):

FileReader

BufferedReader

Медленнее и менее эффективен

Быстрее и эффективнее

Может читать только посимвольно

Может читать символы и строки

Можно читать только из файла

Может читать из любого символьного потока

Вам может быть достаточно и FileReader , если вы читаете из небольших файлов, или когда вызовов операции чтения не очень много. Однако для больших файлов или когда нужно выполнять много операций чтения данных, BufferedReader — это лучший вариант.

5. Заключение

В этом туториале мы с вами рассмотрели различия между FileReader и BufferedReader и когда их следует применять.

Как всегда, полный исходный код туториала доступен на GitHub.

Уже сегодня вечером состоится открытое занятие, на котором познакомимся с Reactor Kafka. На этом уроке посмотрим, как в java-приложении можно работать с Kafka в реактивном стиле. Разберемся, для чего это может быть полезно и когда стоит использовать.

Как работает bufferedreader java

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

При создании объекта BufferedReader вы должны указать входной поток, из которого нужно читать данные. Вы можете использовать метод readLine() для чтения отдельных строк из потока.

Пример использования BufferedReader для чтения файла:

try (BufferedReader br = new BufferedReader(new FileReader("file.txt")))  String line; while ((line = br.readLine()) != null)  System.out.println(line); > > catch (IOException e)  e.printStackTrace(); > 

Этот код открывает файл «file.txt» и читает его содержимое строка за строкой с помощью BufferedReader . Затем каждая строка выводится в стандартный вывод.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *