上節(jié)我們聊到「IO技術(shù)概念及入門」這節(jié)我們繼續(xù)聊一下IO技術(shù)的分類。
Java中流的概念細(xì)分
按流的方向分類:
輸入流:數(shù)據(jù)流向是數(shù)據(jù)源到程序(InputStream、Reader結(jié)尾的流)
輸出流:數(shù)據(jù)流向是程序到目的地(OutPutStream、Writer結(jié)尾的流)
按處理的數(shù)據(jù)單元:
字節(jié)流:按照字節(jié)讀取數(shù)據(jù)(InputStream、OutputStream)命名上以stream結(jié)尾的流一般是字節(jié)流。
字符流:按照字符讀取數(shù)據(jù)(Reader、Writer)。命名上以Reader/Writer結(jié)尾的流一般是字符流。
按處理對象不同分類:
節(jié)點(diǎn)流:可以直接從數(shù)據(jù)源或目的地讀寫數(shù)據(jù)。
處理流:不直接連接到數(shù)據(jù)源或目的地,是”處理流的流”。通過對其他流的處理提高程序的性能。
節(jié)點(diǎn)流處于IO操作的第一線,所有操作必須通過他們進(jìn)行;處理流可以對節(jié)點(diǎn)流進(jìn)行包裝,提高性能或提高程序的靈活性。
Java中IO流類的體系
? ? ??圖1 IO流體系
從上圖發(fā)現(xiàn),很多流都是成對出現(xiàn),比如:FileInputStream/FileOutputStream,顯然是對文件做輸入和輸出操作。我們下面簡單做個(gè)總結(jié):
1.InputStream/OutputStream
字節(jié)流的抽象類。
2.Reader/writer
字符流的抽象類。
3. FileInputStream/FileOutputStream
節(jié)點(diǎn)流;以字節(jié)為單位直接操作“文件”
4. ByteArrayInputStream/ByteArrayOutputStream
節(jié)點(diǎn)流:以字節(jié)為單位直接操作“字節(jié)數(shù)組對象”
5.??ObjectInputStream/ObjectOutputStream
節(jié)點(diǎn)流:以字節(jié)為單位直接操作“對象”
6.??DataInputStream/DataOutputStream
節(jié)點(diǎn)流:以字節(jié)為單位直接操作“基本數(shù)據(jù)類型變量”
7.??FileReader/FileWriter
節(jié)點(diǎn)流:以字符為單位直接操作“文本文件”(注意:只能讀寫文本文件)
8.??BufferedReader/BufferedWriter
處理流:將普通的Reader/Writer對象進(jìn)行包裝,增加緩存提高效率
9.??BufferedInputStream/BufferedOutputStream
處理流:將普通的inputStream/outputStream對象進(jìn)行包裝,增加緩存提高效率
10.??InputStreamReader/OutputStreamWriter
處理流:將字節(jié)流對象轉(zhuǎn)化成字符流對象
11.??PrintStream
打印流?
老鳥建議:
上面的解釋,一句話就點(diǎn)中了流的核心作用。大家后面學(xué)習(xí)的時(shí)候,用心體會(huì)。
四大IO抽象類
InputStream/OutputStream和Reader/writer類是所有IO流類的父類,我們有必要簡單了解一下這個(gè)四個(gè)抽象類的作用。然后,通過它們具體的子類熟悉相關(guān)的用法。
1) InputStream
此抽象類是表示字節(jié)輸入流的所有類的超類。InputSteam是一個(gè)抽象類,它不可以實(shí)例化。?數(shù)據(jù)的讀取需要由它的子類來實(shí)現(xiàn)。根據(jù)節(jié)點(diǎn)的不同,它派生了不同的節(jié)點(diǎn)流子類?。
繼承自InputSteam的流都是用于向程序中輸入數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)(8 bit)。
常用方法:
int read():?讀取一個(gè)字節(jié)的數(shù)據(jù),并將字節(jié)的值作為int類型返回(0-255之間的一個(gè)值)。如果未讀出字節(jié)則返回-1。?
void? close()?:?關(guān)閉輸入流對象,釋放相關(guān)系統(tǒng)資源?
2) OutputStream
此抽象類是表示字節(jié)輸出流的所有類的超類。?輸出流接受輸出字節(jié)并將這些字節(jié)發(fā)送到某個(gè)接收器。
常用方法:
void? write(int n):?向輸入流中寫入一個(gè)字節(jié)
void? close()?:?關(guān)閉輸出流對象,釋放相關(guān)系統(tǒng)資源
3) Reader
Reader用于讀取字符流的抽象類,數(shù)據(jù)單位為字符。
int read():?讀取一個(gè)字符的數(shù)據(jù),并將字符的值作為int類型返回(0-65535之間的一個(gè)值,Unicode值)。如果未讀出字符則返回-1。
void? close()?:?關(guān)閉流對象,釋放相關(guān)系統(tǒng)資源
4)?Writer
Writer寫入字符流的抽象類,數(shù)據(jù)單位為字符。
void? write(int n):?向輸入流中寫入一個(gè)字符
void? close()?:?關(guān)閉輸出流對象,釋放相關(guān)系統(tǒng)資源
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗(yàn),曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作,從小白逐漸做到工程師、高級(jí)工程師、架構(gòu)師。精通Java平臺(tái)軟件開發(fā),精通JAVAEE,熟悉各種流行開發(fā)框架。
? 筆記包含從淺入深的六大部分:
? A-Java入門階段
? B-數(shù)據(jù)庫從入門到精通
? C-手刃移動(dòng)前端和Web前端
? D-J2EE從了解到實(shí)戰(zhàn)
? E-Java高級(jí)框架精解
? F-Linux和Hadoop?