# Readers and Writers
Readers and Writers and their respective subclasses provide simple I/O for text / character-based data.
# BufferedReader
# Introduction
The BufferedReader class is a wrapper for other Reader classes that serves two main purposes:
# Basics of using a BufferedReader
The normal pattern  for using a BufferedReader is as follows.  First, you obtain the Reader that you want to read characters from.  Next you instantiate a BufferedReader that wraps the Reader.  Then you read character data.  Finally you close the BufferedReader which close the wrapped `Reader.    For example:
File someFile = new File(...);
int aCount = 0;
try (FileReader fr = new FileReader(someFile);
     BufferedReader br = new BufferedReader(fr)) {
    // Count the number of 'a' characters.
    int ch;
    while ((ch = br.read()) != -1) {
        if (ch == 'a') {
            aCount++;
        }
    }
    System.out.println("There are " + aCount + " 'a' characters in " + someFile);
}
You can apply this pattern to any Reader
Notes:
# The BufferedReader buffer size
# The BufferedReader.readLine() method
# Example: reading all lines of a File into a List
This is done by getting each line in a file, and adding it into a List<String>. The list is then returned:
public List<String> getAllLines(String filename) throws IOException {
    List<String> lines = new ArrayList<String>();
    try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
        String line = null;
        while ((line = reader.readLine) != null) {
            lines.add(line);
        }
    }
    return lines;
}
Java 8 provides a more concise way to do this using the lines() method:
public List<String> getAllLines(String filename) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
        return br.lines().collect(Collectors.toList());
    }
    return Collections.empty();
}
# StringWriter Example
Java StringWriter class is a character stream that collects output from string buffer, which can be used to construct a string.
The StringWriter class extends the Writer class.
In StringWriter class, system resources like network sockets and files are not used, therefore closing the StringWriter is not necessary.
import java.io.*;  
public class StringWriterDemo {  
    public static void main(String[] args) throws IOException {  
        char[] ary = new char[1024];  
        StringWriter writer = new StringWriter();  
        FileInputStream input = null;  
        BufferedReader buffer = null;  
        input = new FileInputStream("c://stringwriter.txt");  
        buffer = new BufferedReader(new InputStreamReader(input, "UTF-8"));  
        int x;  
        while ((x = buffer.read(ary)) != -1) {  
                   writer.write(ary, 0, x);  
        }  
        System.out.println(writer.toString());        
        writer.close();  
        buffer.close();  
    }  
}
The above example helps us to know simple example of StringWriter using BufferedReader to read file data from the stream.