The purpose of BufferedReader and BufferedWriter is to enhance the reading and writing operations of FileReader and FileWriter, and how to enhance it, similar to the use of StringBuilder, is to put the data into one of their char arrays before manipulating the char array.
Using the buffer character stream is a decorative mode to the FileReader and other functions of the enhancement, decorator mode and inheritance can achieve functional enhancements, but the decorator can do more flexible, do not make the inheritance tree too complex.
Here is a small part of the BufferedWriter source code
public class BufferedReader extends reader { private reader in; The constructor needs to use the reader private char cb[]; Its own char array, which itself the read () method will be to access this array, this array is the buffer private int nchars, Nextchar; The index of the position and number of the char array
Next look at the BufferedWriter source of the Read () method:
public int read () throws IOException { synchronized (lock) { ensureopen (); for (;;) { if (Nextchar >= nchars) { fill (); if (Nextchar >= nchars) return-1; } if (SKIPLF) { SKIPLF = false; if (cb[nextchar] = = ' \ n ') { nextchar++; Continue; } } return cb[nextchar++];}}
This read () method is a char array that accesses the BufferedReader itself, and calls the fill () method to repopulate the char array when it finds that the elements of the array have been accessed. This is the essence of the character stream that uses the buffer.
Similarly, BufferedWriter also writes the data to its own char array, which is then written to the file when it is refreshed.
Attention:
1, when the use of BufferedWriter or BufferedReader, is the filereader of the assignment to the BufferedReader inside the reader object, Therefore, to save the data to the file when calling the parameters of the input BufferedReader reader is invalid, you need to use BufferedReader to refresh or close BufferedReader after the data will be saved to the file;
2. When the BufferedReader is closed, the reader passed in as a parameter will be closed.
3, BufferedReader has a special method Readerline (), the function is to read a line, the principle is read from the char array, determine whether to encounter a newline character, is the word to return.
Here's a bufferedreader code that you write yourself based on the IO video of the Preach Intelligence podcast:
public class Mybufferedreader {private Reader reader; private int count; private int position; Private char[] Contentarray = new char[1024]; private int ch; Private final String line_separate = System.getproperty ("Line.separate"); Public Mybufferedreader (Reader reader) {this.reader = reader; } public int myreader () throws IOException {if (count = = 0) {count = Reader.read (Contentarray); Position = 0; } if (count = =-1) {return-1; } count--; ch = contentarray[position]; position++; return ch; } public String Myreadline () throws IOException {StringBuilder sb = new StringBuilder (256); int ch = 0; while (ch = myreader ())! =-1) {if (ch = = ' \ r ') {continue; } if ((char) ch = = ' \ n ') {return sb.tostring (); } sb.append ((char) ch); } if (sb.Length () > 0) return sb.tostring (); return null; } public void Close () throws IOException {reader.close (); }}
Here is the code for the call:
Try (FileWriter FileWriter = new FileWriter ("Buffer.txt")) { try (bufferedwriter bufferedwriter = new BufferedWriter ( FileWriter)) { int count = 3; while (count! = 0) { bufferedwriter.write ("123456"); Bufferedwriter.newline (); Bufferedwriter.write ("abcdef"); Bufferedwriter.newline (); count-- ; }}} Try (filereader FileReader = new FileReader ("Buffer.txt")) { Mybufferedreader BufferedReader = new Mybufferedreader (FileReader); String line = null; while (line = Bufferedreader.myreadline ())! = null) { System.out.println (line); } }
The result of the operation is:
Disconnected from the target VM, address: ' 127.0.0.1:26416 ', Transport: ' Socket ' 123456abcdef123456abcdef123456abcdefprocess finished with exit code 0
The use and principle of BufferedReader and bufferedwriter of Java-io flow