betacode

Руководство Java BufferedReader

  1. BufferedReader
  2. BufferedReader vs Scanner
  3. Examples
  4. lines()

1. BufferedReader

BufferedReader - это подкласс Reader, который используется для упрощения чтения текста из потоков ввода символов (character input stream) и повышения производительности программы.
Принцип работы BufferedReader выглядит следующим образом:
BufferedReader оборачивает внутри него объект Reader, который автоматически считывает данные из источника (например, файла) и сохраняет их в buffer (буфер) BufferedReader.
BufferedReader переопределяет (override) методы, которые наследуются от его родительского класса, такие как read(), read(char) и т.д, чтобы гарантировать, что они будут работать с данными из buffer, а не из источника (например, файла). Кроме этого, BufferedReader также предоставляет метод readLine() для чтения строки текста из buffer.
Так называемый "buffer", упомянутый выше, на самом деле является просто массивом символов. Объект Reader (из BufferedReader) автоматически считывает символы из источника для хранения в этом массиве.
BufferedReader считывает символы из массива buffer и освобождает позиции чтения. Освобожденные позиции будут использоваться для хранения вновь прочитанных символов из источника.
BufferedReader constructors
public BufferedReader(Reader in)

public BufferedReader(Reader in, int sz)
  • Конструктор BufferedReader(Read,int) создает объект BufferedReader с массивом buffer, размер которого указан.
  • Конструктор BufferedReader(Reader) создает объект BufferedReader с массивом размера buffer, который имеет размерпо умолчанию (sz = 8192).

2. BufferedReader vs Scanner

В некоторых случаях вы можете использовать Scanner вместо BufferedReader. Ниже приведено сравнение между этими двумя классами
  • BufferedReader синхронизирован (потокобезопасен - thread-safe), а Scanner - нет.
  • Сканер может анализировать примитивные типы и строки с помощью регулярных выражений.
  • BufferedReader позволяет указать размер buffer, в то время как Scanner имеет фиксированный размер buffer (1024).
  • BufferedReader имеет размер buffer по умолчанию больше.
  • Scanner скрывает IOException, в то время как BufferedReader заставляет нас обрабатывать его.
  • BufferedReader обычно быстрее Scanner, потому что он только считывает данные без их синтаксического анализа.
  • Руководство Java Scanner

3. Examples

Чтобы создать объект BufferedReader, нам нужно создать объект Reader для чтения данных из источника (например, из файла). Поскольку Reader - это абстрактный класс, поэтому вам нужно создать его из одного из его подклассов
Например: Создать BufferedReader с размером массива buffer16384. Примечание: тип данных char Java - 2 bytes. Это означает, что размер этого buffer составляет 32786 bytes (32 KB).
// Create Reader to read a file.
Reader reader = new FileReader("/Volumes/Data/test/test.txt");

// Create a BufferedReader with buffer array size of 16384 (32786 bytes = 32 KB).
BufferedReader br = new BufferedReader(reader, 16384);
Создать BufferedReader с размером массива buffer по умолчанию (8192), что эквивалентно 16384 bytes (16 KB).
// Create Reader to read a file.
Reader reader = new FileReader("/Volumes/Data/test/test.txt");

// Create a BufferedReader with default buffer array size of 8192 (16384 bytes = 16 KB).
BufferedReader br = new BufferedReader(reader);
Вместо создания BufferedReader из его конструктора, вы можете создать BufferedReader следующим образом:
BufferedReader br =
     Files.newBufferedReader(Paths.get("/Volumes/Data/test/test.txt"));
Например: Использование метода readLine() из BufferedReader для чтения каждой строки текста.
test.txt
Java Tutorials:

Java Reader Tutorial
Java Writer Tutorial
BufferedReaderEx1.java
package org.o7planning.bufferedreader.ex;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class BufferedReaderEx1 {

    public static void main(String[] args) throws IOException {
        // Create Reader to read a file.
        Reader reader = new FileReader("/Volumes/Data/test/test.txt");

        // Create a BufferedReader with buffer array size of 16384 (32786 bytes = 32 KB).
        BufferedReader br = new BufferedReader(reader, 16384);
    
        String line = null;
        
        while((line = br.readLine())!= null) {
            System.out.println(line);
        }
        br.close();
    }
}
Output:
Java Tutorials:

Java Reader Tutorial
Java Writer Tutorial
Например: Использование BufferedReader для чтения URL-адреса:
BufferedReaderEx2.java
package org.o7planning.bufferedreader.ex;

import java.io.BufferedReader;  
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;

public class BufferedReaderEx2 {

    public static void main(String[] args) throws IOException {
        
        URL oracleURL = new URL("https://www.oracle.com/");
        
        InputStream inputStream = oracleURL.openStream();
        
        // Create a Reader from its subclass InputStreamReader.
        Reader reader = new InputStreamReader(inputStream);
        
        BufferedReader br = new BufferedReader(reader);

        String inputLine = null;
        while ((inputLine = br.readLine()) != null) {
            System.out.println(inputLine);
        }
        
        br.close();
    }
}

4. lines()

Возвращает Stream, его элементами являются строки текста, считанные из BufferedReader. Этот Stream ленив, чтение происходит только тогда, когда пользователю действительно нужны данные.
public Stream<String> lines()
students.txt
# Students:

John P
Sarah M
# Sarah B
Charles B
Mary T
Sophia B
Например: Прочитайте текстовый файл, содержащий список имен студентов, удалите строки комментариев (comment), начинающиеся с символа "#", и распечатайте строки, заканчивающиеся на "B".
BufferedReader_lines_ex1.java
package org.o7planning.bufferedreader.ex;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.stream.Stream;

public class BufferedReader_lines_ex1 {

    public static void main(String[] args) throws IOException {
        
        Reader reader = new FileReader("/Volumes/Data/test/students.txt");
         
        BufferedReader br = new BufferedReader(reader, 16384);
    
         Stream<String>  stream = br.lines();  
        
         stream //
             .filter(line -> {
                 return !line.trim().startsWith("#") && line.endsWith("B");
             })  
             .forEach(System.out::println);    
            
         br.close();     
    }
}
Output:
Charles B
Sophia B

Руководства Java IO

Show More