Java I/O流概念分析整理
Java中的流,可以從不同的角度進(jìn)行分類。
- 按照數(shù):輸入流和輸出流。
- 按照處理數(shù)據(jù)單位不同可以分為:字節(jié)流和字符流。
- 按照實現(xiàn)功能不同可以分為:節(jié)點(diǎn)流和處理流。
輸出流:
輸入流:
因此輸入和輸出都是從程序的角度來說的。
字節(jié)流:一次讀入或讀出是8位二進(jìn)制。
字符流:一次讀入或讀出是16位二進(jìn)制。
字節(jié)流和字符流的原理是相同的,只不過處理的單位不同而已。后綴是Stream是字節(jié)流,而后綴是Reader,Writer是字符流。
節(jié)點(diǎn)流:直接與數(shù)據(jù)源相連,讀入或讀出。
直接使用節(jié)點(diǎn)流,讀寫不方便,為了更快的讀寫文件,才有了處理流。
處理流:與節(jié)點(diǎn)流一塊使用,在節(jié)點(diǎn)流的基礎(chǔ)上,再套接一層,套接在節(jié)點(diǎn)流上的就是處理流。
Jdk提供的流繼承了四大類:InputStream(字節(jié)輸入流),OutputStream(字節(jié)輸出流),Reader(字符輸入流),Writer(字符輸出流)。
以下是java中io中常用的流。
字節(jié)輸入流:
字節(jié)輸出流:
字符輸入流:
字符輸出流:
簡單介紹其上圖:
對文件進(jìn)行操作:FileInputStream(字節(jié)輸入流),F(xiàn)ileOutputStream(字節(jié)輸出流),F(xiàn)ileReader(字符輸入流),F(xiàn)ileWriter(字符輸出流)
對管道進(jìn)行操作:PipedInputStream(字節(jié)輸入流),PipedOutStream(字節(jié)輸出流),PipedReader(字符輸入流),PipedWriter(字符輸出流)
PipedInputStream的一個實例要和PipedOutputStream的一個實例共同使用,共同完成管道的讀取寫入操作。主要用于線程操作。
字節(jié)/字符數(shù)組:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在內(nèi)存中開辟了一個字節(jié)或字符數(shù)組。
Buffered緩沖流::BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是帶緩沖區(qū)的處理流,緩沖區(qū)的作用的主要目的是:避免每次和硬盤打交道,提高數(shù)據(jù)訪問的效率。
- 轉(zhuǎn)化流:InputStreamReader/OutputStreamWriter,把字節(jié)轉(zhuǎn)化成字符。
- 數(shù)據(jù)流:DataInputStream,DataOutputStream。
因為平時若是我們輸出一個8個字節(jié)的long類型或4個字節(jié)的float類型,那怎么辦呢?可以一個字節(jié)一個字節(jié)輸出,也可以把轉(zhuǎn)換成字符串輸出,但是這樣轉(zhuǎn)換費(fèi)時間,若是直接輸出該多好啊,因此這個數(shù)據(jù)流就解決了我們輸出數(shù)據(jù)類型的困難。數(shù)據(jù)流可以直接輸出float類型或long類型,提高了數(shù)據(jù)讀寫的效率。
- 打印流:printStream,printWriter,一般是打印到控制臺,可以進(jìn)行控制打印的地方。
- 對象流:ObjectInputStream,ObjectOutputStream,把封裝的對象直接輸出,而不是一個個在轉(zhuǎn)換成字符串再輸出。
- 序列化流:SequenceInputStream。
- 對象序列化:把對象直接轉(zhuǎn)換成二進(jìn)制,寫入介質(zhì)中。
使用對象流需要實現(xiàn)Serializable接口,否則會報錯。而若用transient關(guān)鍵字修飾成員變量,不寫入該成員變量,若是引用類型的成員變量為null,值類型的成員變量為0.
原文鏈接:http://blog.csdn.net/llhhyy1989/article/details/7388059