JAVA learning lesson 49th-IO stream (III): Buffer Zone 2 & amp; Decoration Design Mode
I. Simulate BufferedReader
Custom MyBuffereaReader
In the buffer zone, an array is encapsulated to provide external methods for Array Operations. These methods ultimately operate on the array badge.
Principle: extract data from the source and store it in the buffer zone. After the data is obtained, the system continues to fetch data from the source until the data in the source is obtained, use-1 as the end mark
Import java. io. *; class MyBufferedReader {private FileReader fr; // defines the array as the buffer private char [] ch = new char [1024]; // defines a pointer for Array Operations, when the last element of the array is operated, the pointer returns to private int pos = 0; // defines a counter. When the data in the buffer is reduced to 0, add data from the source to the buffer. private int count = 0; MyBufferedReader (FileReader fr) {this. fr = fr;} public int Myread () throws IOException {// obtain a batch of data from the source to the buffer, first determine whether the count is 0if (count = 0) {count = fr. read (ch); pos = 0;} if (count <0) return- 1; char temp = ch [pos ++]; count --; return temp;} public String MyReadLine () throws IOException {// store the read data to the buffer. StringBuilder sb = new StringBuilder (); int ch = 0; while (ch = Myread ())! =-1) {if (ch = '\ R') continue; if (ch =' \ n') return sb. toString (); sb. append (char) ch);} if (sb. length ()! = 0) return sb. toString (); return null;} public void myClose () throws IOException {fr. close () ;}} public class Main {public static void main (String [] args) throws IOException {FileReader fr = new FileReader ("ACM.txt "); myBufferedReader msb = new MyBufferedReader (fr); String str = null; while (str = msb. myReadLine ())! = Null) {System. out. println (str) ;}msb. myClose ();}}
Ii. Decoration Design Model
When the functions of a group of objects are enhanced, this mode can be used to solve the problem. The above custom MyBufferedReader class is a good embodiment. It is easier for FileReader to compare the original functions, of course, the above Code is relatively simple to write
Class Room {public void show () {System. out. println ("House") ;}} class NewRoom {private Room or; public NewRoom (OldRoom or) {// TODO Auto-generated constructor stubthis. or = or;} public void show () {or. show (); System. out. println ("Bungalow ");}}
You must avoid modifying the source code. Of course, inheritance can also enhance functions.
However, inheritance will make the inheritance system complex and troublesome.
Differences between decorative design patterns and inheritance:
Inheritance: If you want to enhance the function, you must continue to write sub-classes. just to create a new NewRoom, you must create a sub-class. After the NewRoom appears, you must create a sub-class gradually, as a result, the inheritance system becomes increasingly bloated.
Decoration Design Mode: no matter the NewRoom or Villa, it is a type of Room and maintains the basic attributes of the house.
Therefore, to use the decoration design mode, you only need to pass in the decorated object. You can extract and encapsulate the buffer technology separately. You only need to associate the buffer with the buffer, the relative system of such design will become simpler.
3. LineNumberReader
API documentation explanation: trace the buffer character input stream of the row number. This class defines the MethodsetLineNumber(int)
AndgetLineNumber()
They can be used to set and obtain the current row number respectively.
Import java. io. *; public class Main {public static void main (String [] args) throws IOException {FileReader fr = new FileReader ("ACM.txt"); LineNumberReader lr = new LineNumberReader (fr ); string str = null; lr. setLineNumber (10); // set the row number starting from 10 while (str = lr. readLine ())! = Null) {System. out. println (str + "line:" + lr. getLineNumber ();} lr. close ();}}
There are not many such use cases, so you can know how to use them.
Iv. Exercises
Make sure to use byte stream files to copy media files
Import java. io. *; public class Main {public static void main (String [] args) throws IOException {// copy_mp3_1 (); // copy_mp3_2 (); // This copy_mp3_3 ();} public static void copy_mp3_3 () throws IOException {// TODO Auto-generated method stubFileInputStream FD = new FileInputStream ("D: \ .mp3 "); FileOutputStream fos = new FileOutputStream (" D: \ 3.3.mp3 "); byte [] by = new byte [FCM. available ()]; // limitation: the file is too large That won't work. read (by); fos. write (by); fos. close (); FCM. close ();} public static void copy_mp3_2 () throws IOException {// TODO Auto-generated method stubFileInputStream FD = new FileInputStream ("D :\\ .mp3 "); bufferedInputStream br = new BufferedInputStream (FCM); FileOutputStream fos = new FileOutputStream ("D: \ 2.2.mp3"); bytes bw = new BufferedOutputStream (fos); int len = 0; while (len = br. Read ())! =-1) {bw. write (len); bw. flush ();} br. close (); bw. close ();} public static void copy_mp3_1 () throws IOException {// TODO Auto-generated method stubFileInputStream FD = new FileInputStream ("D :\\ .mp3 "); fileOutputStream fos = new FileOutputStream ("D: \ 1.1.mp3"); byte [] by = new byte [1024]; // pay attention to the number of bytes of Mp3 files, the closer the array is to the efficiency, the more int len = 0; while (len = Fi. read ())! =-1) {fos. write (len); fos. flush () ;}fos. close (); FCM. close ();}}