InputStream、InputStreamReader和Reader的關系


InputStream:得到的是字節輸入流,InputStream.read("filename")之后,得到字節流

Reader:讀取的是字符流

InputStreamReader:從字節到字符的橋梁。InputStreamReader(InputStream.read("filename"));

reader.read(InputStreamReader(InputStream in));便可從字節變為字符,打印顯示了。

 

java.io.Reader 和 java.io.InputStream 組成了Java 輸入類。

Reader 用於讀入16位字符,也就是Unicode 編碼的字符;而 InputStream 用於讀入 ASCII 字符和二進制數據。

Reader支持16位的Unicode字符輸出,

InputStream支持8位的字符輸出。

Reader和InputStream分別是I/O庫提供的兩套平行獨立的等級機構,

 

1byte = 8bits

InputStream、OutputStream是用來處理8位元的流,

Reader、Writer是用來處理16位元的流。

而在JAVA語言中,byte類型是8位的,char類型是16位的,所以在處理中文的時候需要用Reader和Writer。

值得說明的是,在這兩種等級機構下,還有一道橋梁InputStreamReader、OutputStreamWriter負責進行InputStream到Reader的適配和由OutputStream到Writer的適配。

在 Java中,有不同類型的 Reader 輸入流對應於不同的數據源:

FileReader 用於從文件輸入; CharArrayReader 用於從程序中的字符數組輸入; StringReader 用於從程序中的字符串輸入; PipedReader 用於讀取從另一個線程中的 PipedWriter 寫入管道的數據。

相應的也有不同類型的 InputStream 輸入流對應於不同的數據源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。

另外,還有兩種沒有對應 Reader 類型的 InputStream 輸入流: Socket 用於套接字; URLConnection 用於 URL 連接。 這兩個類使用 getInputStream() 來讀取數據。

相應的,java.io.Writer 和 java.io.OutputStream 也有類似的區別。

 

 

 關於InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)這兩個方法都是用來從流里讀取多個字節的,有經驗的程序員就會發現,這兩個方法經常 讀取不到自己想要讀取的個數的字節。比如第一個方法,程序員往往希望程序能讀取到b.length個字節,而實際情況是,系統往往讀取不了這么多。仔細閱讀Java的API說明就發現了,這個方法 並不保證能讀取這么多個字節,它只能保證最多讀取這么多個字節(最少1個)。因此,如果要讓程序讀取count個字節,最好用以下代碼:
  byte[] b = new byte[count];
  int readCount = 0; // 已經成功讀取的字節的個數
  while (readCount < count) {
   readCount += in.read(bytes, readCount, count - readCount);
  }
      用這段代碼可以保證讀取count個字節,除非中途遇到IO異常或者到了數據流的結尾(EOFException)


免責聲明!

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



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