1 I/O流的分類
-
按照流:
-
輸入流
輸出流 - 輸出流
-
按照數據處理單位不同
字節流
一次讀入或者是讀取八位二進制,后綴為Stream
字符流
一次讀取或是讀取十六位二進制,后綴為Reader、Writer
按照實現功能的不同
-
節點流
節點流
當直接使用節點流時,讀寫不方便,為了提高效率,才有了處理流。
-
處理流
處理流
處理流是和節點流一起使用,在節點流的基礎上套一層,套在節點流上的就是處理流。
2 常見的I/O流
先上圖:
3 字節流
InputStream
和 OutputStream
是兩個abstract
類,對于字節為導向的 stream
都擴展這兩個基類;
3.1 InputStream抽象類
常用的幾個方法
available():返回stream中的可讀字節數,inputstream類中的這個方法始終返回的是0,這個方法需要子類去實現。
close():關閉stream方法,這個是每次在用完流之后必須調用的方法。
read():方法是讀取一個byte字節,但是返回的是int。
read(byte[]):一次性讀取內容到緩沖字節數組
read(byte[],int,int):從數據流中的哪個位置offset開始讀長度為len的內容到緩沖字節數組
skip(long):從stream中跳過long類型參數個位置
mark(int):用于標記stream的作用
markSupported():返回的是boolean類型,因為不是所有的stream都可以調用mark方法的,這個方法就是用來判斷stream是否可以調用mark方法和 reset方法
reset():這個方法和mark方法一起使用的,讓stream回到mark的位置。
-
ByteArrayInputStream類:把內存中的一個緩沖區作為
InputStream
使用- 構造器:
ByteArrayInputStream(byte[])
:創建一個新字節數組輸入流,從指定的字節數組中讀取數據。(使用byte
作為緩沖區數組)
ByteArrayInputStream(byte[],int,int)
:創建一個新字節數組輸入流,從指定的字節數組指定范圍讀取數據。
- 構造器:
StringBufferInputSteam類:把一個字符串作為
InputStream
構造器:
StringBufferInputStream(String )
不建議使用該類,因為該類不能將字符正確的轉換成字節。FileInputStream類:將一個文件作為
InputStream
,對文件進行操作構造器:
FileInputStream(File)
:創建一個文件流,從一個文件中進行讀取數據
FileInputStream(FileDescriptor)
:創建一個文件流,從指定的文件描述中讀取數據
FileInputStream(String)
:創建一個輸入文件流,從指定的文件名稱中讀取數據。PipeInputStream類:實現了
pipe
的概念,在線程中使用,管道輸入流是只一個通訊管道的接收端。構造器:
PipeInputStream()
:創建一個管道輸入流,它還未和一個管道輸出流連接。
PipeInputStream(PipeOutStream)
:創建一個管道輸入流,已經和管道輸出流連接。方法:
除了實現InputStream
中的部分方法外,還有一個額外的方法
connection(PipeOutStream)
:和一個管道輸出流連接SequenceInputStream類:把多個
InputStream
流合并成一個InputStream
(序列化流),序列化流允許把幾個單獨的輸入流合并到一起,并讓他們像單個輸入流一樣按順序輸入,當前一個輸入流完成后序列化流將自動關閉該流并切換到下一個輸入流。構造器:
SequenceInputStream(Enumeration)
創建一個新的序列化流,并使用一個輸入流的枚舉初始化它。
SequenceInputStream(InputStream,InputStream,InputStream...)
FilterInputStream:一個過濾的
InputStream
兩個常用的子類
- BufferedInputStream:使用緩沖區的
InputStream
- 構造器:
BufferedInputStream (InputStream)
:用InputStream
作為參數初始化實例。
BufferedInputStream (InputStream,int)
:設置緩沖區大小的實例。
- DataInputStream:數字格式化的stream
- 構造器
DataInputStream(InputStream):使用InputStream參數來初始化實例 - 額外的方法:
readInt,readFloat,readDouble...這樣可以直接從stream中讀取基本類型的數據
3.2 OutPutStream抽象類
常用的幾個方法
write(int):寫入一個字節到stream中
write(byte[])寫入一個byte數組到stream中
write(byte[],int,int):把byte數組中從offset開始處寫入長度為len的數據
close():關閉流,這個是在操作完stream之后必須要調用的方法
flush():這個方法是用來刷新stream中的數據,讓緩沖區中的數據強制的輸出
ByteArrayOutputStream: 把信息存入內存中的一個緩沖區中 . 該類實現一個以字節數組形式寫入數據的輸出流,當數據寫入緩沖區時,它自動擴大。用 toByteArray() 和 toString() 能檢索數據。
構造器
ByteArrayOutputStream()
創建一個新的字節數組輸出流。
ByteArrayOutputStream(int)
創建一個新的字節數組輸出流,并帶有指定大小字節的緩沖區容量。額外的方法:
toByteArray()
將字節流轉化成一個字節數組,用于數據的檢索
toString()
將字節流轉化成一個String對象,默認采用系統的編碼轉化,同樣可以用于數據的檢索
toString(String)
根據指定字符編碼將緩沖區內容轉換為字符串,并將字節轉換為字符。
writeTo(OutputStream)
用out.write(buf, 0, count)
調用輸出流的寫方法將該字節數組輸出流的全部內容寫入指定的輸出流參數。FileOutputStream: 文件輸出流是向 File 或 FileDescriptor 輸出數據的一個輸出流。
構造器
FileOutputStream(File name)
創建一個文件輸出流,向指定的 File 對象輸出數據。
FileOutputStream(FileDescriptor)
創建一個文件輸出流,向指定的文件描述器輸出數據。
FileOutputStream(String name)
創建一個文件輸出流,向指定名稱的文件輸出數據。
FileOutputStream(String, boolean)
用指定系統的文件名,創建一個輸出文件。PipedOutputStream: 管道輸出流是指一個通訊管道的發送端。 一個線程通過管道輸出流發送數據,而另一個線程通過管道輸入流讀取數據,這樣可實現兩個線程間的通訊。
構造器
PipedOutputStream()
創建一個管道輸出流,它還未與一個管道輸入流連接。
PipedOutputStream(PipedInputStream)
創建一個管道輸出流,它已連接到一個管道輸入流。額外的方法:
connection(PipedInputStream):
連接一個PipedInputStream方法
4 字符流
以Unicode
字符為導向的流,表示以Unicode
字符為單位向Stream
中存儲或者是從Stream
中讀取。Reader/Writer
為抽象類,其中方法和InputStream和OutputStraem
中對應。
4.1 Reader
CharArrayReader :與
ByteArrayInputStream
對應此類實現一個可用作字符輸入流的字符緩沖區構造器
CharArrayReader(char[]) 用指定字符數組創建一個 CharArrayReader 。
CharArrayReader(char[], int, int) 用指定字符數組創建一個 CharArrayReaderStringReader: 與
StringBufferInputStream
對應其源為一個字符串的字符流。FileReader **: 與
FileInputStream
對應PipedReader **:與
PipedInputStream
對應InputStreamReader**:將
InputStream
轉化成Reader
4.2 Writer
CharArrayWriter: 與
ByteArrayOutputStream
對應StringWriter:無與之對應的以字節為導向的
stream
FileWriter: 與
FileOutputStream
對應PipedWriter:與
PipedOutputStream
對應OutputStreamWriter:將
OutputStream
轉化成Writer
PrintReader:和
PrintStream
對應
5 兩種不同流之間的轉換
- InputStreamReader 類是從字節流到字符流的橋梁:它讀入字節,并根據指定的編碼方式,將之轉換為字符流。
使用的編碼方式可能由名稱指定,或平臺可接受的缺省編碼方式。 - InputStreamReader 的 read() 方法之一的每次調用,可能促使從基本字節輸入流中讀取一個或多個字節。
**為了達到更高效率,考慮用 BufferedReader 封裝 InputStreamReader **
6 Java IO 的一般使用原則
按數據來源(去向)分類:
1 是文件: FileInputStream, FileOutputStream, ( 字節流 )FileReader, FileWriter( 字符 )
2.是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字節流 )
3 是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )
4 是 String: StringBufferInputStream, StringBufferOuputStream ( 字節流 )StringReader, StringWriter( 字符流 )
5 網絡數據流: InputStream, OutputStream,( 字節流 ) Reader, Writer( 字符流 )按是否格式化輸出分:
1 要格式化輸出: PrintStream, PrintWriter按是否要緩沖分:
1 要緩沖: BufferedInputStream, BufferedOutputStream,( 字節流 ) BufferedReader, BufferedWriter( 字符流 )按數據格式分:
1 二進制格式(只要不能確定是純文本的) : InputStream, OutputStream 及其所有帶 Stream 結束的子類
2 純文本格式(含純英文與漢字或其他編碼方式); Reader, Writer 及其所有帶 Reader, Writer 的子類按輸入輸出分:
1 輸入: Reader, InputStream 類型的子類
2 輸出: Writer, OutputStream 類型的子類特殊需要:
1 從 Stream 到 Reader,Writer 的轉換類: InputStreamReader, OutputStreamWriter
2 對象輸入輸出: ObjectInputStream, ObjectOutputStream
3 進程間通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4 合并輸入: SequenceInputStream
5 更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader