提要01 IO流(BufferedWriter)02 IO流(BufferedReader)03 IO流(通過緩衝區複製文本文件)04 IO流(readLine的原理)05 IO流(MyBufferedReader)06 IO流(裝飾設計模式)07 IO流(裝飾和繼承的區別)01 IO流(Buffe...
提要
01 IO流(BufferedWriter)
02 IO流(BufferedReader)
03 IO流(通過緩衝區複製文本文件)
04 IO流(readLine的原理)
05 IO流(MyBufferedReader)
06 IO流(裝飾設計模式)
07 IO流(裝飾和繼承的區別)
01 IO流(BufferedWriter)
字元流的緩衝區
緩衝區的出現提高了對數據的讀寫效率。
對應類
BufferedWriter
BufferedReader
緩衝區要結合流才可以使用
在流的基礎上對流的功能進行了加強
1 /*
2 緩衝區的出現是為了提高流的操作效率,
3 所以在創建緩衝區之前,必須要先有流對象。
4
5 該緩衝區提供了一個跨平臺的換行方法 newLine()
6 */
7 import java.io.*;
8 public class BufferedWriterDemo
9 {
10 public static void main(String[] args)throws IOException
11 {
12 //創建一個字元寫入流對象
13 FileWriter fw=new FileWriter("buf.txt");
14
15 //為了提高字元寫入流效率,加入了緩衝區
16 //只要將需要被提高效率的流對象作為參數傳遞給緩衝區的構造函數即可
17 BufferedWriter bufw=new BufferedWriter(fw);
18
19 for(int x=1;x<5;x++)
20 {
21 bufw.write("abcde"+x);
22 //寫入一個行分隔符,是跨平臺的
23 bufw.newLine();
24 //記住,只要用到緩衝區,就要記得刷新
25 bufw.flush();
26 }
27
28 //其實,關閉緩衝區,就是在關閉緩衝區流中的對象
29 bufw.close();
30
31
32
33
34 }
35 }
02 IO流(BufferedReader)
1 /*
2 字元讀取緩衝區
3 該緩衝區提供了一個一次讀一行的方法,readLine()
4 */
5 import java.io.*;
6 public class BufferedReaderDemo
7 {
8 public static void main(String[] args)throws IOException
9 {
10 //創建一個讀取流對象和文件相關連
11 FileReader fr=new FileReader("buf.txt");
12
13 //為了提高效率,加入緩衝技術,
14 //將字元讀取流對象作為參數傳遞給緩衝對象的構造函數
15 BufferedReader bufr=new BufferedReader(fr);
16
17 String line;
18
19 while((line=bufr.readLine())!=null)
20 {
21 System.out.println(line);
22 }
23
24 bufr.close();
25 }
26 }
03 IO流(通過緩衝區複製文本文件)
註意:readLine方法只返回回車符前面的部分,並不返回回車符。
1 /*
2 通過緩衝區複製一個.java文件
3 */
4 import java.io.*;
5 public class CopyTextByBuf
6 {
7 public static void main(String[] args)
8 {
9 BufferedReader bufr=null;
10 BufferedWriter bufw=null;
11
12 try
13 {
14 bufr=new BufferedReader(new FileReader("BufferedWriterDemo.java"));
15 bufw=new BufferedWriter(new FileWriter("buffferWriter_Copy.txt"));
16
17 String line;
18 while((line=bufr.readLine())!=null)
19 {
20 bufw.write(line);
21 bufw.newLine();
22 bufw.flush();
23 }
24 }
25 catch (IOException e)
26 {
27 throw new RuntimeException("讀寫失敗!");
28 }
29 finally
30 {
31 try
32 {
33 if(bufr!=null)
34 bufr.close();
35 }
36 catch (IOException e)
37 {
38 throw new RuntimeException("讀取關閉失敗!");
39 }
40 try
41 {
42 if(bufw!=null)
43 bufw.close();
44 }
45 catch (IOException e)
46 {
47 throw new RuntimeException("寫入關閉失敗!");
48 }
49 }
50 }
51 }
04 IO流(readLine的原理)
無論是讀一行,或者讀取多個字元,其實最終都是在硬碟上一個一個讀取,所以最終使用的還是read方法一次一次讀取。
05 IO流(MyBufferedReader)
1 /*
2 明白了BufferedReader類中特有方法reaLine的原理後,
3 可以自定義一個類中包含一個功能和readLine一致的方法。
4 來模擬一下BufferedReader
5
6 */
7 import java.io.*;
8 class MyBufferedReader
9 {
10 private FileReader r;
11 MyBufferedReader(FileReader r)
12 {
13 this.r=r;
14 }
15 //可以一次讀一行數據的方法
16 public String myReadLine() throws IOException
17 {
18 //定義一個臨時容器,原BufferReader封裝的是字元數組
19 //為了演示方便,定義一個StringBuilder容器
20 //因為最終還是要將數據變成字元串
21
22 StringBuilder sb=new StringBuilder();
23 int ch=0;
24 while((ch=r.read())!=-1)
25 {
26 if(ch=='\r')
27 continue;
28 if(ch=='\n')
29 return sb.toString();
30 else
31 sb.append((char)ch);
32 }
33 if(sb.length()!=0)
34 return sb.toString();
35 return null;
36 }
37 public void myClose()throws IOException
38 {
39 r.close();
40 }
41 }
42
43 public class MyBufferedReaderDemo
44 {
45 public static void main(String[] args) throws IOException
46 {
47 FileReader fr=new FileReader("buf.txt");
48
49 MyBufferedReader myBuf=new MyBufferedReader(fr);
50 String line=null;
51 while((line=myBuf.myReadLine())!=null)
52 {
53 System.out.println(line);
54 }
55 myBuf.myClose();
56
57 }
58 }
06 IO流(裝飾設計模式)
1 /*
2 裝飾設計模式:
3 當想要對已有的對象進行功能增強時,
4 可以定義類,將已有對象傳入,基於已有功能,並提供加強功能
5 那麼自定義的這個類就成為裝飾類
6
7 裝飾類通常會通過構造方法接收被裝飾的的對象
8 並基於被裝飾對象的功能,提供更強的功能
9 */
10 class Person
11 {
12 public void chiFan()
13 {
14 System.out.println("吃飯");
15 }
16 }
17 class SuperPerson
18 {
19 private Person p;
20 public SuperPerson(Person p)
21 {
22 this.p=p;
23 }
24 public void superChiFan()
25 {
26 System.out.println("開胃酒");
27 p.chiFan();
28 System.out.println("甜點");
29 System.out.println("來一根");
30
31 }
32 }
33 public class PersonDemo
34 {
35 public static void main(String[] args)
36 {
37 SuperPerson sp=new SuperPerson(new Person());
38 sp.superChiFan();
39
40 }
41 }
07 IO流(裝飾和繼承的區別)
用繼承體系來實現功能增強
MyReader//專門用於讀取數據的類
|--MyTextReader
|--MyBufferTextReader
|--MyMediaTextReader
|--MyBufferMediaReader
|--MyDataReader
|--MyBufferDataReader
class MyBufferReader
{
MyBufferReader(MyTextReader text)
{}
MyBufferReader(MyMediaTextReader media text)
{}
}
上面這個類的擴展性很差
找到其參數的共同類型,通過多態的形式,可以提高擴展性
class MyBufferReader extends MyReader
{
MyBufferReader(MyReader r)
{}
}
用裝飾來實現功能增強
MyReader//專門用於讀取數據的類
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferReader
裝飾模式比繼承要靈活,避免了繼承體系的臃腫
而且降低了類與類之間的關係。
裝飾類因為增強已有對象,具備的功能和已有對象是相同的,
只不過是提供了更強的功能
所以裝飾類和被裝飾類通常是屬於一個體系的