java IO選擇流的原則及其與IO流相關類的關系


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 確定選用流對象的步驟

  • 確定原始數據的格式
  • 確定是輸入還是輸出
  • 是否需要轉換流
  • 數據的來源(去向)
  • 是否需要緩沖
  • 是否需要格式化輸出

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接口,來聲明其是可以序列化的。否則,不能用對象流讀寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM