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