標籤:情境 mat 大小 抽象 預設 允許 writer ade 效能
基本 IO
重要介面
重要類位元組類
InputStream
特點: 讀取位元組流的抽象類別
BufferedInputStream
特點:
- 用位元組緩衝區來從
InputStream 中讀取流
- 緩衝區預設大小是 8K, 可能會增長
- 實現了
mark() 和 reset() 方法
fill() 方法
ByteArrayInputStream
特點:
- 從記憶體中的位元組數組的位元組讀取流
- 實現了
mark() 和 reset()
DataInputStream
特點:
- 允許從下層流中以Java基礎資料型別 (Elementary Data Type)
- 一個應用可以用
DataOutputStream 寫入流再用 DataInputStream 讀出
FilterInputStream
特點:
OutputStream
特點: 寫入位元組流的抽象類別
BufferedOutputStream
特點: 增加了緩衝區, 使得不用每次 write() 都調用底層流 write()
ByteArrayOutputStream
特點: 將位元組寫入記憶體中的一段地區
DataOutputStream
特點:
- 將基礎類型資料寫入流, 可移植
- 讀取時要用
DateInputStream
FilterOutputStream
特點: 為其他流提供附加功能的裝飾流父類
字元類
Reader
特點: 讀取字元流的抽象類別
BufferedReader
特點:
- 從字元流中讀取文本到緩衝區, 以便更有效地被讀取.
- 緩衝區預設大小是8192(8KB).
- 建議任何字元流的
Reader 都被 BufferedReader 所裝飾. 否則每個 read()操作都會調用底層 read() 的操作.
LineNumberReader
特點: 在 BufferedReader 基礎上保留了追蹤行號
CharArrayReader
特點: 從記憶體緩衝區中讀取字元到另外一個緩衝區
InputStreamReader
特點:
- 用於橋接一個位元組流成為字元流, 使得位元組流以字元讀取並編碼
- 每次
read()會觸發一個或多個位元組的讀取操作. 為了更有效將位元組轉化成字元, 有時會預讀一些位元組
FileReader
特點:
- 讀取文字檔的類
- 其建構函式假設預設的字元編碼和預設位元組緩衝區大小是合適的
- 若不合適, 需要用
FileInputStream實力構造一個InputStreamReader對象,然後將這個對象傳到其Reader建構函式.
FilterReader
特點: 抽象類別, 用來讀取Filtered字元流
PushbackReader
特點: 允許往字元流末尾添加一個或者多個字元
PipedReader
特點: 從管道PipedWriter中讀取字元
StringReader
特點: 從String中讀取字元
Writer
特點: 寫入字元流的抽象類別
BufferedWriter
特點:
- 向字元輸出資料流中寫入文本, 為字元, 字元數組, 字串提供緩衝以便更加有效寫入
- 緩衝區預設大小是8192(8KB)
newLine()會往輸出資料流中寫入一個 line.separator
- 建議任何字元流的
Writer 都被 BufferedWriter 所裝飾. 否則每個 writer() 操作都會調用底層 write() 的操作
CharArrayWriter
特點:
- 將記憶體中的一個字元緩衝區當做
Writer使用
- 當資料往流中寫入時, 字元緩衝區大小會自動成長
- 資料可以通過
toCharArray() 或者 toString()直接擷取到
close() 方法沒有什麼作用. 即使調用了close()後, 再調用其他方法, 也不會產生異常
OutputStreamWriter
特點:
- 用來將字元流橋接到一個位元組流
- 每次調用
write()方法, 都會導致對字元的編碼, 編碼後的位元組流一直在 buffer 中累計, 在調用底層位元組流的write()方法時寫入
- 應該與
BufferedWriter連用
FileWriter
特點:
- 讀取文字檔的類
- 其建構函式假設預設的字元編碼和預設位元組緩衝區大小是合適的
- 若不合適, 需要用
FileOutputStream實力構造一個OutputStreamWriter對象,然後將這個對象傳到其Writer建構函式.
FilterWriter
特點: 抽象類別, 用來寫入Filtered字元流
PipedWriter
特點: 向管道寫入字元流
PrintWriter
特點:
PrintWriter 用來格式化對象並輸出到字元流中
PrintWriter 包含了很多類型的寫出方法, 但是不包括原始byte類型
- 不像
PrintStream, 即使開啟了 automatic flushing , 方法println, printf或者 format 方法調用後才會 flush.
StringWriter
特點: 往StringBuffer 中寫入資料
其他FAQ
問: Externalizable 和 Serializable 的區別是什麼?
答: 由於Serializable是一個標誌介面. 使用Serializable不需要實現任何方法, Java runtime 會使用反射來 marshal 和 unmarshal 對象.
在Java 舊版本中, 反射非常慢, 所以 serializing 大對象會有一定的效能問題. 為瞭解決這個問題, Java 提供了 Externalizable 介面讓開發人員自訂 marshal 和 unmarshal 方法.
在 Java 1.3 後, 反射的效能得到了大幅度提升. 現在很少有情境需要
Externalizable.
Java 基礎 - 基本 IO