1 按照用途進行分類
1.1 按照數據的來源(去向)分類
- 是文件:FileInputStream, FileOutputStream, FileReader, FileWriter
- 是byte[]:ByteArrayInputStream, ByteArrayOutputStream
- 是char[]:CharArrayReader, CharArrayWriter
- 是String:StringBufferInputStream(已過時,因為其只能用於String的每個字符都是8位的字符串), StringReader, StringWriter
- 是網絡數據流:InputStream, OutputStream, Reader, Writer
1.2 按照格式化輸出
- 需要格式化輸出:PrintStream(輸出字節),PrintWriter(輸出字符)
1.3 按緩沖功能分
- 要緩沖:BufferedInputStream, BufferedOuputStream, BuffereaReader, BufferedWriter
1.4 按照數據格式分
- 二進制格式(只要確定不是純文本格式的),InputStream, OutputStream, 及其所有帶Stream子類
- 純文本格式(比如英文/漢字/或其他編碼文字):Reader, Writer, 及其相關子類
1.5 按照輸入輸出分
- 輸入:Reader, InputStream,及其相關子類
- 輸出:Writer,OutputStream,及其相關子類
1.6 特殊需求
- 從Stream轉化為Reader,Writer:InputStreamReader,OutputStreamWriter
- 對象輸入輸出流:ObjectInputStream,ObjectOutputStream
- 進程間通信:PipeInputStream,PipeOutputStream,PipeReader,PipeWriter
- 合並輸入:SequenceInputStream
- 更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
2 確定選用流對象的步驟
- 確定原始數據的格式
- 確定是輸入還是輸出
- 是否需要轉換流
- 數據的來源(去向)
- 是否需要緩沖
- 是否需要格式化輸出
3 Java中Inputstream/OutputStream與Reader/Writer的區別
Reader/Writer和InputStream/OutputStream分別是I/O庫提供的兩套平行獨立的等級機構,InputStream、OutputStream是用來處理8位元的流,也就是用於讀寫ASCII字符和二進制數據;Reader、Writer是用來處理16位元的流,也就是用於讀寫Unicode編碼的字符。在JAVA語言中,byte類型是8位的,char類型是16位的,所以在處理中文的時候需要用Reader和Writer。- 兩種等級機構下,有一道橋梁InputStreamReader、OutputStreamWriter負責進行InputStream到Reader的適配和由OutputStream到Writer的適配。
在Java中,有不同類型的Reader/InputStream輸入流對應於不同的數據源:FileReader/FileInputStream 用於從文件輸入;CharArrayReader/ByteArrayInputStream 用於從程序中的字符數組輸入;StringReader/StringBufferInputStream 用於從程序中的字符串輸入;PipedReader/PipeInputStream 用於讀取從另一個線程中的 PipedWriter/PipeOutputStream 寫入管道的數據。相應的也有不同類型的Writer/OutputStream輸出流對應於不同的數據源:FileWriter/FileOutputStream,CharArrayWriter/ByteArrayOutputStream,StringWriter,PipeWriter/PipedOutputStream。
有兩種沒有對應Reader類型的InputStream輸入流,用getInputStream()來讀取數據。Socket 用於套接字;URLConnection 用於 URL 連接。
4 流類的繼承關系圖
4.1 .繼承自InputStream/OutputStream的流都是用於向程序中輸入/輸出數據,且數據的單位都是字節(byte=8bit),如圖,深色的為節點流,淺色的為處理流。

4.2 .繼承自Reader/Writer的流都是用於向程序中輸入/輸出數據,且數據的單位都是字符(2byte=16bit),如圖,深色的為節點流,淺色的為處理流。

4.3 節點流類型
- 對文件操作的字符流有FileReader/FileWriter,
- 字節流有FileInputStream/FileOutputStream。
4.4 處理流類型
- 緩沖流:緩沖流要“套接”在相應的節點流之上,對讀寫的數據提供了緩沖的功能,提高了讀寫效率,同事增加了一些新的方法。
- 字節緩沖流有BufferedInputStream/BufferedOutputStream,字符緩沖流有BufferedReader/BufferedWriter,字符緩沖流分別提供了讀取和寫入一行的方法ReadLine和NewLine方法。
- 對於輸出地緩沖流,寫出的數據,會先寫入到內存中,再使用flush方法將內存中的數據刷到硬盤。所以,在使用字符緩沖流的時候,一定要先flush,然后再close,避免數據丟失。
- 轉換流:用於字節數據到字符數據之間的轉換。
- 字符流InputStreamReader/OutputStreamWriter。其中,InputStreamReader需要與InputStream“套接”,OutputStreamWriter需要與OutputStream“套接”。
- 數據流:提供了讀寫Java中的基本數據類型的功能。
- DataInputStream和DataOutputStream分別繼承自InputStream和OutputStream,需要“套接”在InputStream和OutputStream類型的節點流之上。
- 對象流:用於直接將對象寫入寫出。
- 流類有ObjectInputStream和ObjectOutputStream,本身這兩個方法沒什么,但是其要寫出的對象有要求,該對象必須實現Serializable接口,來聲明其是可以序列化的。否則,不能用對象流讀寫。
