結構圖
根據處理類型分
根據處理數據的數據類型的不同可以分為:字節流(抽象基類為InPutStream和OutPutStream)和字符流(抽象基類為Reader和Writer)。根據流向不同,可以分為:輸入流和輸出流。
字符流和字節流的主要區別:
- 1.字節流讀取的時候,讀到一個字節就返回一個字節; 字符流使用了字節流讀到一個或多個字節(中文對應的字節數是兩個,在UTF-8碼表中是3個字節)時。先去查指定的編碼表,將查到的字符返回。
- 2.字節流可以處理所有類型數據,如:圖片,MP3,AVI視頻文件,而字符流只能處理字符數據。只要是處理純文本數據,就要優先考慮使用字符流,除此之外都用字節流。
IO流主要可以分為節點流和處理流兩大類
節點流類型
可以從一個特定的地點或節點讀寫數據
類型 | 字符流 | 字節流 |
---|---|---|
File(文件) | FileReader FileWriter | FileInputStream FileOutputSream |
Memory Array | CharArrayReader CharArrayWriter | ByteArrayInputStream ByteArrayOutputSream |
Memory String | StringReader StringWriter | - |
Pipe(管道) | PipedReader PipedWriter | PipedInputSream PipedOutputSream |
處理流類型
該類型是對一個已存在的流的連接和封裝,通過所封裝的流的功能調用實現數據讀寫,處理流的構造方法總是要帶一個其他流對象作為參數,一個流對象進過其他流的多次包裝,叫做流的鏈接。主要可以分為以下幾種:
緩沖流(BufferedInPutStream/BufferedOutPutStream和BufferedWriter/BufferedReader)他可以提高對流的操作效率
- 寫入緩沖區對象
BufferedWriter bufw=new BufferedWriter(new FileWriter("buf.txt"));
- 讀取緩沖區對象:
BufferedReader bufr=new BufferedReader(new FileReader("buf.txt"));
該類型流有readLine()方法一次讀取一行,直到末尾返回null
轉換流(InputStreamReader/OutputStreamWriter)
該類型是字節流與字符流之間的橋梁,可以對讀取到的字節數據進行指定編碼的編碼轉換,構造函數主要有:
InputStreamReader(InputStream); //通過構造函數初始化,使用的是本系統默認的編碼表GBK。
InputStreamWriter(InputStream,String charSet); //通過該構造函數初始化,可以指定編碼表。
OutputStreamWriter(OutputStream); //通過該構造函數初始化,使用的是本系統默認的編碼表GBK。
OutputStreamwriter(OutputStream,String charSet); //通過該構造函數初始化,可以指定編碼表。
(字節流轉字符流)FileReader fr=new FileReader(“a.txt”); 與 InputStreamReader isr=new InputStreamReader(new FileInputStream("a.txt")); 的意義相同,指定編碼如InputStreamReader isr=new InputStreamReader(new FileInputStream("a.txt"),utf-8);
數據流(DataInputStream/DataOutputStream)
數據流可以方便地對一些基本類型數據進行直接的存儲和讀取,不需要再進一步進行轉換,通常只要操作基本數據類型的數據,就需要通過DataStream進行包裝。構造方法:
DataInputStreamReader(InputStream);
DataInputStreamWriter(OutputStream);```
方法舉例
int readInt();//一次讀取四個字節,并將其轉成int值
writeInt(int);//一次寫入四個字節,注意和write(int)不同,write(int)只將該整數的最低一個8位寫入,剩余三個8為丟失
hort readShort();
writeShort(short);
String readUTF();//按照utf-8修改版讀取字符,注意,它只能讀writeUTF()寫入的字符數據。
writeUTF(String);//按照utf-8修改版將字符數據進行存儲,只能通過readUTF讀取。
###打印流(PrintStream/PrintWriter)
PrintStream是一個字節打印流,System.out對應的類型就是PrintStream,它的構造函數可以接受三種數據類型的值:1.字符串路徑。2.File對象 3.OutputStream
PrintStream是一個字符打印流,它的構造函數可以接受四種類型的值:1.字符串路徑。2.File對象 3.OutputStream 4.Writer 對于1、2類型的數據,可以指定編碼表,也就是字符集,對于3、4類型的數據,可以指定自動刷新,當該自動刷新為True時,只有3個方法可以用:println,printf,format。
###對象流(ObjectInputStream/ObjectOutputStream)
該類型的流可以把類作為一個整體進行存取,主要方法有:
Object readObject();該方法拋出異常:ClassNotFountException。
void writeObject(Object):被寫入的對象必須實現一個接口:Serializable,否則就會拋出:NotSerializableException