1 I/O流的分類
-
按照流:
-
輸入流
輸出流 - 輸出流
-
按照數(shù)據(jù)處理單位不同
字節(jié)流
一次讀入或者是讀取八位二進制拟赊,后綴為Stream
字符流
一次讀取或是讀取十六位二進制询件,后綴為Reader矾麻、Writer
按照實現(xiàn)功能的不同
-
節(jié)點流
節(jié)點流
當(dāng)直接使用節(jié)點流時,讀寫不方便,為了提高效率,才有了處理流双霍。
-
處理流
處理流
處理流是和節(jié)點流一起使用,在節(jié)點流的基礎(chǔ)上套一層,套在節(jié)點流上的就是處理流洒闸。
2 常見的I/O流
先上圖:
3 字節(jié)流
InputStream
和 OutputStream
是兩個abstract
類染坯,對于字節(jié)為導(dǎo)向的 stream
都擴展這兩個基類;
3.1 InputStream抽象類
常用的幾個方法
available():返回stream中的可讀字節(jié)數(shù),inputstream類中的這個方法始終返回的是0顷蟀,這個方法需要子類去實現(xiàn)酒请。
close():關(guān)閉stream方法,這個是每次在用完流之后必須調(diào)用的方法鸣个。
read():方法是讀取一個byte字節(jié),但是返回的是int。
read(byte[]):一次性讀取內(nèi)容到緩沖字節(jié)數(shù)組
read(byte[],int,int):從數(shù)據(jù)流中的哪個位置offset開始讀長度為len的內(nèi)容到緩沖字節(jié)數(shù)組
skip(long):從stream中跳過long類型參數(shù)個位置
mark(int):用于標(biāo)記stream的作用
markSupported():返回的是boolean類型布朦,因為不是所有的stream都可以調(diào)用mark方法的囤萤,這個方法就是用來判斷stream是否可以調(diào)用mark方法和 reset方法
reset():這個方法和mark方法一起使用的,讓stream回到mark的位置是趴。
-
ByteArrayInputStream類:把內(nèi)存中的一個緩沖區(qū)作為
InputStream
使用- 構(gòu)造器:
ByteArrayInputStream(byte[])
:創(chuàng)建一個新字節(jié)數(shù)組輸入流涛舍,從指定的字節(jié)數(shù)組中讀取數(shù)據(jù)。(使用byte
作為緩沖區(qū)數(shù)組)
ByteArrayInputStream(byte[],int,int)
:創(chuàng)建一個新字節(jié)數(shù)組輸入流唆途,從指定的字節(jié)數(shù)組指定范圍讀取數(shù)據(jù)富雅。
- 構(gòu)造器:
StringBufferInputSteam類:把一個字符串作為
InputStream
構(gòu)造器:
StringBufferInputStream(String )
不建議使用該類,因為該類不能將字符正確的轉(zhuǎn)換成字節(jié)肛搬。FileInputStream類:將一個文件作為
InputStream
没佑,對文件進行操作構(gòu)造器:
FileInputStream(File)
:創(chuàng)建一個文件流,從一個文件中進行讀取數(shù)據(jù)
FileInputStream(FileDescriptor)
:創(chuàng)建一個文件流温赔,從指定的文件描述中讀取數(shù)據(jù)
FileInputStream(String)
:創(chuàng)建一個輸入文件流蛤奢,從指定的文件名稱中讀取數(shù)據(jù)。PipeInputStream類:實現(xiàn)了
pipe
的概念陶贼,在線程中使用啤贩,管道輸入流是只一個通訊管道的接收端。構(gòu)造器:
PipeInputStream()
:創(chuàng)建一個管道輸入流拜秧,它還未和一個管道輸出流連接痹屹。
PipeInputStream(PipeOutStream)
:創(chuàng)建一個管道輸入流,已經(jīng)和管道輸出流連接枉氮。方法:
除了實現(xiàn)InputStream
中的部分方法外志衍,還有一個額外的方法
connection(PipeOutStream)
:和一個管道輸出流連接SequenceInputStream類:把多個
InputStream
流合并成一個InputStream
(序列化流),序列化流允許把幾個單獨的輸入流合并到一起嘲恍,并讓他們像單個輸入流一樣按順序輸入足画,當(dāng)前一個輸入流完成后序列化流將自動關(guān)閉該流并切換到下一個輸入流。構(gòu)造器:
SequenceInputStream(Enumeration)
創(chuàng)建一個新的序列化流佃牛,并使用一個輸入流的枚舉初始化它淹辞。
SequenceInputStream(InputStream,InputStream,InputStream...)
FilterInputStream:一個過濾的
InputStream
兩個常用的子類
- BufferedInputStream:使用緩沖區(qū)的
InputStream
- 構(gòu)造器:
BufferedInputStream (InputStream)
:用InputStream
作為參數(shù)初始化實例。
BufferedInputStream (InputStream,int)
:設(shè)置緩沖區(qū)大小的實例。
- DataInputStream:數(shù)字格式化的stream
- 構(gòu)造器
DataInputStream(InputStream):使用InputStream參數(shù)來初始化實例 - 額外的方法:
readInt,readFloat,readDouble...這樣可以直接從stream中讀取基本類型的數(shù)據(jù)
3.2 OutPutStream抽象類
常用的幾個方法
write(int):寫入一個字節(jié)到stream中
write(byte[])寫入一個byte數(shù)組到stream中
write(byte[],int,int):把byte數(shù)組中從offset開始處寫入長度為len的數(shù)據(jù)
close():關(guān)閉流象缀,這個是在操作完stream之后必須要調(diào)用的方法
flush():這個方法是用來刷新stream中的數(shù)據(jù)蔬将,讓緩沖區(qū)中的數(shù)據(jù)強制的輸出
ByteArrayOutputStream: 把信息存入內(nèi)存中的一個緩沖區(qū)中 . 該類實現(xiàn)一個以字節(jié)數(shù)組形式寫入數(shù)據(jù)的輸出流,當(dāng)數(shù)據(jù)寫入緩沖區(qū)時央星,它自動擴大霞怀。用 toByteArray() 和 toString() 能檢索數(shù)據(jù)。
構(gòu)造器
ByteArrayOutputStream()
創(chuàng)建一個新的字節(jié)數(shù)組輸出流莉给。
ByteArrayOutputStream(int)
創(chuàng)建一個新的字節(jié)數(shù)組輸出流毙石,并帶有指定大小字節(jié)的緩沖區(qū)容量。額外的方法:
toByteArray()
將字節(jié)流轉(zhuǎn)化成一個字節(jié)數(shù)組颓遏,用于數(shù)據(jù)的檢索
toString()
將字節(jié)流轉(zhuǎn)化成一個String對象徐矩,默認(rèn)采用系統(tǒng)的編碼轉(zhuǎn)化,同樣可以用于數(shù)據(jù)的檢索
toString(String)
根據(jù)指定字符編碼將緩沖區(qū)內(nèi)容轉(zhuǎn)換為字符串叁幢,并將字節(jié)轉(zhuǎn)換為字符滤灯。
writeTo(OutputStream)
用out.write(buf, 0, count)
調(diào)用輸出流的寫方法將該字節(jié)數(shù)組輸出流的全部內(nèi)容寫入指定的輸出流參數(shù)。FileOutputStream: 文件輸出流是向 File 或 FileDescriptor 輸出數(shù)據(jù)的一個輸出流曼玩。
構(gòu)造器
FileOutputStream(File name)
創(chuàng)建一個文件輸出流鳞骤,向指定的 File 對象輸出數(shù)據(jù)。
FileOutputStream(FileDescriptor)
創(chuàng)建一個文件輸出流黍判,向指定的文件描述器輸出數(shù)據(jù)豫尽。
FileOutputStream(String name)
創(chuàng)建一個文件輸出流,向指定名稱的文件輸出數(shù)據(jù)样悟。
FileOutputStream(String, boolean)
用指定系統(tǒng)的文件名拂募,創(chuàng)建一個輸出文件。PipedOutputStream: 管道輸出流是指一個通訊管道的發(fā)送端窟她。 一個線程通過管道輸出流發(fā)送數(shù)據(jù)陈症,而另一個線程通過管道輸入流讀取數(shù)據(jù),這樣可實現(xiàn)兩個線程間的通訊震糖。
構(gòu)造器
PipedOutputStream()
創(chuàng)建一個管道輸出流录肯,它還未與一個管道輸入流連接。
PipedOutputStream(PipedInputStream)
創(chuàng)建一個管道輸出流吊说,它已連接到一個管道輸入流论咏。額外的方法:
connection(PipedInputStream):
連接一個PipedInputStream方法
4 字符流
以Unicode
字符為導(dǎo)向的流,表示以Unicode
字符為單位向Stream
中存儲或者是從Stream
中讀取颁井。Reader/Writer
為抽象類厅贪,其中方法和InputStream和OutputStraem
中對應(yīng)。
4.1 Reader
CharArrayReader :與
ByteArrayInputStream
對應(yīng)此類實現(xiàn)一個可用作字符輸入流的字符緩沖區(qū)構(gòu)造器
CharArrayReader(char[]) 用指定字符數(shù)組創(chuàng)建一個 CharArrayReader 雅宾。
CharArrayReader(char[], int, int) 用指定字符數(shù)組創(chuàng)建一個 CharArrayReaderStringReader: 與
StringBufferInputStream
對應(yīng)其源為一個字符串的字符流养涮。FileReader **: 與
FileInputStream
對應(yīng)PipedReader **:與
PipedInputStream
對應(yīng)InputStreamReader**:將
InputStream
轉(zhuǎn)化成Reader
4.2 Writer
CharArrayWriter: 與
ByteArrayOutputStream
對應(yīng)StringWriter:無與之對應(yīng)的以字節(jié)為導(dǎo)向的
stream
FileWriter: 與
FileOutputStream
對應(yīng)PipedWriter:與
PipedOutputStream
對應(yīng)OutputStreamWriter:將
OutputStream
轉(zhuǎn)化成Writer
PrintReader:和
PrintStream
對應(yīng)
5 兩種不同流之間的轉(zhuǎn)換
- InputStreamReader 類是從字節(jié)流到字符流的橋梁:它讀入字節(jié),并根據(jù)指定的編碼方式,將之轉(zhuǎn)換為字符流贯吓。
使用的編碼方式可能由名稱指定懈凹,或平臺可接受的缺省編碼方式。 - InputStreamReader 的 read() 方法之一的每次調(diào)用悄谐,可能促使從基本字節(jié)輸入流中讀取一個或多個字節(jié)介评。
**為了達到更高效率,考慮用 BufferedReader 封裝 InputStreamReader **
6 Java IO 的一般使用原則
按數(shù)據(jù)來源(去向)分類:
1 是文件: FileInputStream, FileOutputStream, ( 字節(jié)流 )FileReader, FileWriter( 字符 )
2.是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字節(jié)流 )
3 是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )
4 是 String: StringBufferInputStream, StringBufferOuputStream ( 字節(jié)流 )StringReader, StringWriter( 字符流 )
5 網(wǎng)絡(luò)數(shù)據(jù)流: InputStream, OutputStream,( 字節(jié)流 ) Reader, Writer( 字符流 )按是否格式化輸出分:
1 要格式化輸出: PrintStream, PrintWriter按是否要緩沖分:
1 要緩沖: BufferedInputStream, BufferedOutputStream,( 字節(jié)流 ) BufferedReader, BufferedWriter( 字符流 )按數(shù)據(jù)格式分:
1 二進制格式(只要不能確定是純文本的) : InputStream, OutputStream 及其所有帶 Stream 結(jié)束的子類
2 純文本格式(含純英文與漢字或其他編碼方式)爬舰; Reader, Writer 及其所有帶 Reader, Writer 的子類按輸入輸出分:
1 輸入: Reader, InputStream 類型的子類
2 輸出: Writer, OutputStream 類型的子類特殊需要:
1 從 Stream 到 Reader,Writer 的轉(zhuǎn)換類: InputStreamReader, OutputStreamWriter
2 對象輸入輸出: ObjectInputStream, ObjectOutputStream
3 進程間通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4 合并輸入: SequenceInputStream
5 更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader