?? I/O 是 input 和 output 的簡寫,java API 中,可以讀入字節或字符序列的對象稱為輸入流,可以寫入字節或字符序列的對象稱為輸出流。其來源地和目的地可以是文件,也可以是 socket、http、數組甚至是兩個線程之間。
?? I/O 包下有幾十個類文件,大概分為以下幾種:
由InputStream、OutputStream、Reader、Writer為代表的 I/O 類 與文件系統相關的淚,例如File、FileFilter、RandomaccessFile等序列化相關的類 其他,例如工具類、異常類從InputStream和OutputStream中繼承的類是用來處理字節流。從Reader和Writer繼承的類是用來處理 Unicode 字符,這些類的讀寫操作都是基于 Unicode 碼元的。通過InputStreamReader和OutputStreamWriter可以將字節流轉為字符流。     
流家族體系 
 上圖中,紅色的類表示已被棄用。    
InputStream有幾個常用的方法 : * mark : mark方法用于標記當前讀取的位置,與reset方法配合使用。 * reset : 返回mark標記的位置,重新從該位置讀取字節 * markSupported : 是否支持 mark/reset  * available : 剩余未讀取的字節數 * skip : 跳過并丟棄指定的字節數 * read : 讀取字節
| 類 | markSupported | skip? | 說明 | 
|---|---|---|---|
| ByteArrayInputStream | 支持 | 支持 | 輸入源,將byte[]作為輸入源的類 | 
| FileInputStream | 支持 | 支持 | 輸入源,將文件作為輸入源的類 | 
| PipedInputStream | 不支持 | 支持 | 輸入源,用于進程間通信,與PipedOutputStream配合使用 | 
| SequenceInputStream | 不支持 | 支持 | 將多個輸入源合并成一個輸入源,available方法只返回當前輸入源的available | 
繼承自FilterInputStream子類是裝飾器類,它們不能自己產生字節序列,需要配合輸入源才能使用,它們的主要作用是增加輸入流的功能。在別的編程語言里,諸如緩沖機制和預覽等細節都是自動處理的,相對而言,Java 就比較麻煩,必須配合裝飾器類才能實現。但是這種方式帶來極大的靈活性。   
| 類 | markSupported | skip? | 說明 | 
|---|---|---|---|
| BufferedInputStream | 支持 | 支持 | 給輸入流增加緩沖機制 | 
| PushbackInputStream | 不支持 | 支持 | 給輸入流增加推回功能,即將讀取的字節推回到緩沖區 | 
| DataInputStream | 不支持 | 支持 | 允許應用程序以與機器無關方式從底層輸入流中讀取基本 Java 數據類型,一般與DataOutputStream配合使用,另外DataInputStream讀取時采用的 Java 版的 UTF-8 編碼,與標準 UTF-8 不同。所以DataInputStream讀取的字節流必須時通過DataOutputStream寫入的,不然會出問題 | 
OutputStream有幾種常用的方法: 
| 類 | 說明 | 
|---|---|
| ByteArrayOutputStream |  將輸出流轉化為byte[] | 
| FileOutputStream | 文件輸出流 | 
| PipedOutputStream |  管道輸出流,與PipedOutputStream配合使用 | 
類似于FilterInputStream,FilterOutputStream也是裝飾器類的基類。    
| 類 | 說明 | 
|---|---|
| BufferedOutputStream | 給輸出流增加緩沖機制 | 
| PRintStream |  打印輸出流可直接輸出至文件 (里面封裝了FileOutputStream)自動刷新功能,遇到/n或者寫入一個byte數組之后自動調用flush方法可方便打印各種數據值表示形式與其他輸出流不同,它產生的IOException異常會被自身函數捕獲,可以通過checkError檢查是否發生過異常通過format方法,支持格式化輸出打印的字符使用平臺默認字符編碼轉換為字節,也可以指定編碼類型null值會被轉為null字符,布爾類型會被轉為true和false字符 | 
| DataOutputStream |  允許應用程序以與機器無關方式寫入基本 Java 數據類型,配合DataInputStream使用。 | 
ObjectInputStream和ObjectOutputStream用于對象的序列化,可以將任何 Java 類型包括對象,序列化成字節序列。    
Reader用于讀取字符流的抽象類,使用字符流讀取文件,比字節流更高效。可通過InputStreamReader將字節流轉換為字符流。   
| 類 | markSupported | skip? | 說明 | 
|---|---|---|---|
| CharArrayReader | 支持 | 支持 | 輸入源,將char[]作為輸入源的類 | 
| StringReader | 支持 | 支持 | 輸入源,將String作為輸入源的類 | 
| PipedReader | 不支持 | 支持 | 類似PipedInputStream | 
| FileReader | 不支持 | 支持 | 類似FileInputStream,實際上就是在FileInputStream外面套了InputStreamReader類 | 
| InputStreamReader | 不支持 | 支持 | 將字節流轉為字符流,可以指定字符編碼 | 
| BufferedReader | 支持 | 支持 | 類似于BufferedInputStream,帶有緩沖機制的字符流,需要提供輸入源 | 
| PushbackReader | 不支持 | 支持 | 類似PushbackInputStream | 
| 類 | 說明 | 
|---|---|
| CharArrayWriter |  將輸出流轉為char[]。null值被轉為null字符串 | 
| StringWriter |  將輸出流轉為String。null值被轉為null字符串 | 
| PipedWriter |  類似PipedOutputStream | 
| PrintWriter |  類似PrintStream | 
| OutStreamWriter | 將字節流轉為字符流,可以指定字符編碼 | 
| BufferedWriter |  類似于BufferedOutputStream,帶有緩沖機制的字符流,需要提供輸入源 | 
新聞熱點
疑難解答