天天看點

Java IO體系筆記前言:主題:

前言:

此文适合JAVA IO體系的朋友。

主題:

Java IO:即 Java 輸入 / 輸出系統。

Java 的輸入和輸出:讀資料就用輸入(InputStream/Reader), 寫資料就用輸出(OutputStream/Writer)。

Stream:Java 中将資料的輸入輸出抽象為流,流是一組有順序的,單向的,有起點和終點的資料集合,就像水流。按照流中的最小資料單元又分為位元組流和字元流。

  1. 位元組流:以 8 位(即 1 byte,8 bit)作為一個資料單元,資料流中以【位元組】為最小資料單元。
  2. 字元流:以 16 位(即 1 char,2 byte,16 bit)作為一個資料單元,資料流中以【字元】為最小資料單元(Java 中的字元是 Unicode 編碼,一個字元占用兩個位元組)。 

1.IO體系常用流類

Java IO體系筆記前言:主題:

Java IO體系

2.IO分類

Java IO體系筆記前言:主題:

3.歸納總結

歸納前,先區分節點流和處理流。Java io又分為節點流和處理流,節點流是真正直接處理資料的;處理流是裝飾加工節點流的。

節點流

  • 檔案流:FileInputStream,FileOutputStrean,FileReader,FileWriter,它們都會直接操作檔案,直接與 OS 底層互動。是以他們被稱為節點流 (使用這幾個流的對象之後,需要關閉流對象,因為 java 垃圾回收器不會主動回收。不過在 Java7 之後,可以在 try() 括号中打開流,最後程式會自動關閉流對象,不再需要顯示地 close) 
  • 數組流:ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter,對數組進行處理的節點流。 字元串流:StringReader,StringWriter,其中 StringReader 能從 String 中讀取資料并儲存到 char 數組
  • 管道流:PipedInputStream,PipedOutputStream,PipedReader,PipedWrite,對管道進行處理的節點流。

處理流

處理流是對一個已存在的流的連接配接和封裝,通過所封裝的流的功能調用實作資料讀寫。如 BufferedReader。 處理流的構造方法總是要帶一個其他的流對象做參數。 常用處理流(通過關閉處理流裡面的節點流來關閉處理流)

  • 緩沖流 :BufferedImputStrean,BufferedOutputStream,BufferedReader ,BufferedWriter,需要父類作為參數構造,增加緩沖功能,避免頻繁讀寫硬碟,可以初始化緩沖資料的大小,由于帶了緩沖功能,是以就寫資料的時候需要使用 flush 方法,另外,BufferedReader 提供一個 readLine( ) 方法可以讀取一行,而 FileInputStream 和 FileReader 隻能讀取一個位元組或者一個字元,是以 BufferedReader 也被稱為行讀取器。
  • 轉換流:InputStreamReader,OutputStreamWriter,要 inputStream 或 OutputStream 作為參數,實作從位元組流到字元流的轉換,我們經常在讀取鍵盤輸入(System.in)或網絡通信的時候,需要使用這兩個類。
  • 資料流:DataInputStream,DataOutputStream,提供将基礎資料類型寫入到檔案中,或者讀取出來。

3.1位元組輸入流

  1. InputStream 是所有的輸入位元組流的父類,它是一個抽象類。
  2. PushbackInputStream、DataInputStream 和 BufferedInput Stream都是處理流,他們的的父類是 FilterInputStream。
  3. ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三種基本的媒體流,它們分别從 Byte 數組、StringBuffer、和本地檔案中讀取資料。PipedInputStream 是從與其它線程共用的管道中讀取資料。

3.2位元組輸出流

  1. OutputStream 是所有的輸出位元組流的父類,它是一個抽象類。
  2. ByteArrayOutputStream、FileOutputStream 是兩種基本的媒體流,它們分别向 Byte 數組、和本地檔案中寫入資料。
  3. PipedOutputStream 是向與其它線程共用的管道中寫入資料。
  4. BufferedOutputStream、DataOutputStream 和 PrintStream 都是處理流,他們的的父類是 FilterOutputStream。

3.3字元輸入流

  1. Reader 是所有的輸入字元流的父類,它是一個抽象類。
  2. CharReader、StringReader 是兩種基本的媒體流,它們分别将 Char 數組、String 中讀取資料。PipedReader 是從與其它線程共用的管道中讀取資料。
  3. BufferedReader 很明顯就是一個裝飾器,它和其子類負責裝飾其它 Reader 對象。
  4. FilterReader 是所有自定義具體裝飾流的父類,其子類 PushbackReader 對 Reader 對象進行裝飾,會增加一個行号。
  5. InputStreamReader 是一個連接配接位元組流和字元流的橋梁,它将位元組流轉變為字元流。

3.4字元輸入流

  1. Writer 是所有的輸出字元流的父類,它是一個抽象類。
  2. CharArrayWriter、StringWriter 是兩種基本的媒體流,它們分别向 Char 數組、String 中寫入資料。PipedWriter 是向與其它線程共用的管道中寫入資料。
  3. BufferedWriter 是一個裝飾器為 Writer 提供緩沖功能。
  4. PrintWriter 和 PrintStream 極其類似,功能和使用也非常相似。
  5. OutputStreamWriter 是 OutputStream 到 Writer 轉換的橋梁,它的子類 FileWriter 其實就是一個實作此功能的具體類。

4.JAVA IO 常見面試題

1、位元組流和字元流的差別?

  • 讀寫機關不同:位元組流以位元組(8 bit)為機關,字元流以字元為機關。
  • 處理對象不同:位元組流能處理所有類型的資料(如圖檔、avi 等),而字元流隻能處理字元類型的資料。
  • 位元組流沒有緩沖區,是直接輸出的,而字元流是輸出到緩沖區的。是以在輸出時,位元組流不調用 colse() 方法時,資訊已經輸出了,而字元流隻有在調用 close() 方法關閉緩沖區時,資訊才輸出。要想字元流在未關閉時輸出資訊,則需要手動調用 flush() 方法。

2、什麼叫對象序列化,什麼是反序列化,實作對象序列化需要做哪些工作?

  • 對象序列化:将對象以二進制的形式儲存在硬碟上;
  • 反序列化:将二進制的檔案轉化為對象讀取;
  • 實作 serializable 接口可以實作對象序列化,其中沒有需要實作的方法,implements Serializable 隻是為了标注該對象是可被序列化的。

    例如,在 web 開發中,如果對象被儲存在了 Session 中,tomcat 在重新開機時要把 Session 對象序列化到硬碟,這個對象就必須實作 Serializable 接口。如果對象要經過分布式系統進行網絡傳輸,被傳輸的對象就必須實作 Serializable 接口。

3、什麼是 Filter 流有哪些?

FilterStream 是一種 IO 流,主要作用是用來對存在的流增加一些額外的功能,像給目标檔案增加源檔案中不存在的行數,或者增加拷貝的性能等。在 java.io 包中主要由 4 個可用的 filter Stream。兩個位元組 filter stream,兩個字元 filter stream。分别是:FilterInputStream,FilterOutputStream,FilterReader and FilterWriter. 這些類是抽象類,不能被執行個體化的。

FilterInputStream 流的子類:

  • DataInputStream 可以把包括基本類型在内的資料和字元串按順序從資料源讀入,它有一些特殊的方法如 readInt(),readDouble() 和 readLine() 等可以讀取一個 int,double 和一個 string。
  • BufferedInputStream 增加性能。
  • PushbackInputStream 推送要求的位元組到系統中。
  • 注:其它子類見 Java io 分類圖。

4、說說 RandomAccessFile?

它在 java.io 包中是一個特殊的類,既不是輸入流也不是輸出流,它兩者都可以做到。他是 Object 的直接子類。通常來說,一個流隻有一個功能,要麼讀,要麼寫。但是 RandomAccessFile 既可以讀檔案,也可以寫檔案。而且 RandomAccessFile 支援對檔案的随機通路。

下一篇: Java I/O總結