我對(duì)IO流的理解上并沒(méi)什么問(wèn)題,但前一片段上課時(shí)有經(jīng)常使用到IO流。發(fā)現(xiàn)自己對(duì)JAVAIO流沒(méi)有系統(tǒng)的概念,JAVAIO流的要類是InputStream和OutputStream,這兩個(gè)類的子類較多,而且還有一部分的包裝類。SO,我要對(duì)JAVAIO流有一個(gè)系統(tǒng)的學(xué)習(xí)。
JAVA IO 全視圖:
InputStream部分:
InputStream,它是一個(gè)抽象類,所示所有輸入流的的超類。它包含了輸入流的基本操作。
AudioIntpuStream,音頻輸入流對(duì)應(yīng)的輸出。結(jié)合AudioSystem可以實(shí)現(xiàn):
1. 從外部音頻文件、流或 URL 獲得音頻輸入流
2. 從音頻輸入流寫(xiě)入外部文件
3. 將音頻輸入流轉(zhuǎn)換為不同的音頻格式
ByteArrayInputStream,字節(jié)數(shù)據(jù)輸入流。字面的翻譯。它包含了一個(gè)緩沖區(qū),該緩沖區(qū)從輸入游戲中讀取字節(jié)。因?yàn)閿?shù)據(jù)已經(jīng)讀入到緩沖區(qū)中,所以關(guān)閉流對(duì)它無(wú)效,仍然可以調(diào)用它的方法而不會(huì)拋出異常。
FileInputStream,文件輸入流。從文件中獲取輸入字節(jié),包含對(duì)文件流的特殊方法。如果要讀取字符流,可以使用FileReader。
PipedInputStream,管道輸入流。用于線程間的通訊,但不要在同一個(gè)線程中使用管道輸入流和輸出流,這樣可能造成線程死鎖。
SequenceInputStream,輸入流的邏輯串聯(lián)。它將多個(gè)輸入流串聯(lián)到一起讀取。比如它串聯(lián)了輸入流A和B,當(dāng)讀取到A的結(jié)尾時(shí),便從B流中接著讀取。
StringBufferInputStream,與ByteArrayInputSteam類同,ByteArrayInputStream用于處理字節(jié),而StringBufferInputStream用于處理字符。
ObjectInputStream,Java對(duì)象輸入流。實(shí)現(xiàn)將對(duì)象從輸入流中讀取。比如將ObjectOutputStream與FileOutputStream結(jié)合使用,將JAVA對(duì)象序列化后保存到文件。然后再使用FileInputStream和ObjectInputStream將文件中被序列化的JAVA對(duì)象反序列化回來(lái)到程序中。也可以在遠(yuǎn)程通訊中使用對(duì)象流傳輸JAVA對(duì)象,這個(gè)比較高級(jí)。
FilterInputStream:JDK幫助文檔中說(shuō)它只是簡(jiǎn)單的重寫(xiě)將所有對(duì)輸入流的操作傳遞給它所包含的InputStream輸入流。嗯,其實(shí)它是一個(gè)Decorate模式的超類。從它繼承了一些子類,用于提供一些額外的功能,向下看。
BufferedInputStream,對(duì)InputStream增加了緩存功能。以更好的支持mark和reset方法。
CheckedInputStream,校驗(yàn)輸入流。可用于驗(yàn)證輸入數(shù)據(jù)的完整性。與Checksum配合使用。
CipherInputStream,解密輸入流。與Cipher配合使用。CipherOutputStream是加密輸出流。對(duì)數(shù)據(jù)進(jìn)行加解密使用。
DigestInputStream,摘要輸入流。這個(gè)比較少見(jiàn),棱一看JDK手冊(cè),不太了解。不過(guò)數(shù)據(jù)摘要是用于安全通訊或數(shù)據(jù)完整證驗(yàn)證的。哦,它與MessageDigest配合使用,可見(jiàn)JAVA IO設(shè)計(jì)者的用心!
LineNumberInputStream,行號(hào)輸入流。此類已過(guò)時(shí)。它假定輸入流是字符流,它調(diào)用InputStream的方法并將\n\r統(tǒng)一轉(zhuǎn)換成一個(gè)\n。每讀到一個(gè)換行時(shí),便將行號(hào)加1,初始行號(hào)為0。此類不深入研究了!
ProgressMonitor,進(jìn)度監(jiān)視輸入流。用于監(jiān)視用戶讀取的進(jìn)度,如果這個(gè)流很大。它會(huì)自動(dòng)彈出進(jìn)度提示窗口,用戶可以點(diǎn)擊“Cancel”按鈕,取消讀取。這個(gè)也實(shí)JAVAIO給實(shí)現(xiàn)了,比較人性化!
PushBackInputStream,推回輸入流。就是可以將從輸入流中讀取的數(shù)據(jù),調(diào)用unread方法將數(shù)據(jù)推回到輸入流中,也可以將其他數(shù)據(jù)推進(jìn)去。JDK手冊(cè)中舉了一個(gè)例子說(shuō),將標(biāo)識(shí)符字符讀取后,可以推回到輸入然,然后重復(fù)讀取,在哪里需要這樣的應(yīng)用呢?
DataInputStream,數(shù)據(jù)輸入流。可以以與機(jī)器無(wú)關(guān)方式從底層輸入流中讀取基本JAVA數(shù)據(jù)類型。
InflaterInputStream: 解壓縮輸入流。解壓縮以“deflate”壓縮格式的流過(guò)濾器。它與Inflater配合使用,Inflater使用流行的ZLIB壓縮庫(kù)。
GZipInputStream,GZip解壓縮輸入流。解壓縮以“GZip”壓縮格式的流過(guò)濾器。
ZipInputStream,Zip解壓縮輸入流。解壓縮以“Zip”壓縮格式的流過(guò)濾器。
JarInputStream,Jar解壓縮輸入流。可以讀取Jar文件中的內(nèi)容。其實(shí)Jar的壓縮格式就是Zip格式。但它比Zip多了一個(gè)Manifest條目。Manifest 可用于存儲(chǔ)有關(guān) JAR 文件及其條目的元信息。關(guān)于Manifest,可以查看JDK手冊(cè)。
OK,OutputStream在此就不一一列出了。因?yàn)?/span>OutpuStream中子類與InputStream中的子類相對(duì)應(yīng)。但OutpuStream不完全具有與InputStream中的子類對(duì)應(yīng)的類。因?yàn)闆](méi)必要,比如AudioInputStream,沒(méi)有與之對(duì)應(yīng)的AudioOutputStream,我們需要讀取指定格式的音頻即可。如果想寫(xiě)出音頻數(shù)據(jù)直接用FileOutputStream即可! Java中還有Writer和Reader兩個(gè)超類,主要用于處理字符流,這個(gè)比較簡(jiǎn)單就不在此做介紹了。OK!