java万法_Java I/O库的设计分析
Java采用了流的機制來實現輸入/輸出。所謂流,就是數據的有序排列。
而流可以是從某個源(稱為流源或Source of Stream)出來,到某個目的地(稱為流匯或Sink of Stream)去的。
由流的方向,可以分成輸入流和輸出流。一個程序從輸入流讀取數據向輸出流寫數據。
流處理器所處理的流必定都有流源,而如果將流類所處理的流源分類的話,基本可以分成兩大類:
第一 數組,String,File等,這一種叫原始流源。
第二 同樣類型的流用做鏈接流類的流源,叫鏈接流源。
Java語言的I/O庫是對各種常見的流源,流匯以及處理過程的抽象化。
客戶端的Java程序不必知道最終的流源,流匯是磁盤上的文件還是數組等;(原始流)
也不必關心數據是否經過緩沖的,可否按照行號讀取等處理的細節。(鏈接流)
要理解Java I/O這個龐大而復雜的庫,關鍵是要掌握兩個對稱性跟兩個設計模式。
Java I/O庫具有兩個對稱性,它們分別是:
1 輸入-輸出對稱性:
比如InputStream和OutputStream各自占據Byte流的輸入與輸出的兩個平行的等級結構的根部。
而Reader和Writer各自占據Char流的輸入與輸出的兩個平行的等級結構的根部。
2 byte-char對稱:
InputStream和Reader的子類分別負責Byte和Char流的輸入;
OutputStream和Writer的子類分別負責Byte和Char流的輸出,
它們分別形成平行的等級結構。
Java I/O庫的兩個設計模式:
裝飾者模式(Decorator)
適配器模式(Adapter)
1 裝飾者模式:
在由InputStream,OutputStream,Reader和Writer代表的等級結構內部,有一些流處理器可以對另一些流處理器起到裝飾作用,形成新的,具有改善了的功能的流處理器。
【裝飾者模式是Java I/O庫的整體設計模式】
2 適配器模式:
在由InputStream,OutputStream,Reader和Writer代表的等級結構內部,有一些流處理器是對其它類型的流源的適配。
【適配器模式應用到了原始流處理器的設計上面,構成了I/O庫所有流處理器的起點。】
裝飾者模式的具體應用:
Java I/O庫是由一些基本的原始流處理器和圍繞它們的裝飾流處理器所組成的。
InputStream類型中的裝飾模式:
InputStream有七個直接的具體子類,和四個屬于FilterInputStream的具體子類。
根據輸入流的源的類型,可以將這些流類分成兩種,
即原始流類(Original Stream)和鏈接流處理器(Wrapper Stream)。
原始流處理器:
接收一個Byte數組對象,String對象,FileDiscriptor對象或者不同類型的流源對象。
包括以下四種:
1)ByteArrayInputStream
2)FileInputStream
3)PipedInputStream
4)StringBufferInputStream
鏈接流處理器:
就是可以接收另一個流對象作為源,并對之進行功能擴展的類。
包括以下幾種:
1)FilterInputStream,四個子類如下:
1.1)BufferedInputStream
1.2)DataInputStream
1.3)LineNumberInputStream
1.4)PushbackInputStream
2)ObjectInputStream
3)SeqcueneInputStream
裝飾模式的使用目的:
鏈接流對象接收一個原始流對象或者另外一個鏈接流對象作為流源;
另一方面他們對流源的內部工作方法做了相應的改變。
適配器模式的具體應用:
FileInputStream是一個適配器類:
它繼承了InputStrem類型,同時持有一個對FileDiscriptor的引用。
這是將一個FileDiscriptor對象適配成InputStrem類型的對象形式的適配器模式。
StringBufferInputStream是一個適配器類:
它繼承了InputStream類型,同時持有一個對String對象的引用。
這是一個將String對象適配成InputStream類型的對象形式的適配器模式。
ByteArrayOutputStream是一個適配器類:
它繼承了OutputStream類型,同時持有一個對byte數組的引用。
這是一個將byte數組的接口適配成OutputStream類型的接口的適配器模式。
FileOutputStream是一個適配器類:
它繼承了OutputStream類型,同時持有一個對FileDiscriptor對象的引用。
這是一個將FileDiscriptor接口適配成OutputStream接口的適配器模式。
StringReader是一個適配器類:
它類繼承了Reader類型,持有一個對String對象的引用。
這是一個將String的接口適配成Reader類型的接口的適配器模式。
InputStreamReader是一個適配器類:
它繼承了Reader類型,同時持有一個對InputStream對象的引用。
InputStreamReader是從byte輸入流到char輸入流的一個適配器
OutputStreamWriter是適配器類:
。。。
OutputStringWriter是從OutputStream到Writer的適配器類
與任何一個OutputStream的具體子類相鏈接時,OutputStringWriter可以將OutputStream類型的byte流適配成為char流。
其他參考內容:
原始流處理器
1. ByteArrayInputStream:為多線程的通信提供緩沖區操作功能,接收一個Byte數組作為流的源。
2. FileInputStream:建立一個與文件有關的輸入流。接收一個File對象作為流的源。
3. PipedInputStream:可以與PipedOutputStream配合使用,用于讀入一個數據管道的數據,接收一個PipedOutputStream作為源。
4. StringBufferInputStream:將一個字符串緩沖區轉換為一個輸入流。接收一個String對象作為流的源。
(JDK幫助文檔上說明:已過時。此類未能正確地將字符轉換為字節。從JDK1.1開始,從字符串創建流的首選方法是通過StringReader類進行創建。只有字符串中每個字符的低八位可以由此類使用。)
鏈接流處理器:
1. FilterInputStream稱為過濾輸入流,它將另一個輸入流作為流源。這個類的子類包括以下幾種:
BufferedInputStream:用來從硬盤將數據讀入到一個內存緩沖區中,并從緩沖區提供數據。
DataInputStream:提供基于多字節的讀取方法,可以讀取原始類型的數據。
LineNumberInputStream:提供帶有行計數功能的過濾輸入流。
PushbackInputStream:提供特殊的功能,可以將已經讀取的字節“推回”到輸入流中。
2. ObjectInputStream可以將使用ObjectInputStream串行化的原始數據類型和對象重新并行化。
3. SeqcueneInputStream可以將兩個已有的輸入流連接起來,形成一個輸入流,從而將多個輸入流排列構成一個輸入流序列。
Java語言的I/O庫提供InputStream,OutputStream,Reader,Writer四個系列的類。
InputStream和OutputStream處理8位字節流數據;Reader和Writer處理16位的字符流數據。
InputStream和Reader處理輸入,OutputStream和Writer處理輸出。
Java語言支持四種類型:Java接口,Java類,Java數組,原始類型(即int,float等)。
前三種是引用類型,類和數組的實例是對象,原始類型的值不是對象。
也即,Java語言的數組是像所有的其他對象一樣的對象,而不管數組中所存儲的元素類型是什么。
總結
以上是生活随笔為你收集整理的java万法_Java I/O库的设计分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017年广发信用卡周五半价活动:京东、
- 下一篇: 信用卡审核没通过还能再办吗 信用卡被拒多