1. 程式人生 > 實用技巧 >【014期】JavaSE面試題(十四):基本IO流

【014期】JavaSE面試題(十四):基本IO流

開篇介紹

大家好,我是Java面試題庫的提褲姐,今天這篇是JavaSE系列的第十四篇,主要總結了Java中的IO流的問題,IO流分為兩篇來講,這篇是第一篇,主要是基本IO流,第二篇主要為網路IO流,在後續,會沿著第一篇開篇的知識線路一直總結下去,做到日更!如果我能做到百日百更,希望你也可以跟著百日百刷,一百天養成一個好習慣。

什麼是io流

它是一種資料的流從源頭流到目的地。比如檔案拷貝,輸入流和輸出流都包括了。輸入流從檔案中讀取資料儲存到程序(process)中,輸出流從程序中讀取資料然後寫入到目標檔案。

Java中有幾種型別的流?

按照流的方向

  • 輸入流(inputStream
  • 輸出流(outputStream
    )。

按照實現功能分

  • 節點流(可以從或向一個特定的地方(節點)讀寫資料。如FileReader)
  • 處理流(是對一個已存在的流的連線和封裝,通過所封裝的流的功能呼叫實現資料讀寫。如BufferedReader。處理流的構造方法總是要帶一個其他的流物件做引數。一個流物件經過其他流的多次包裝,稱為流的連結。)

按照處理資料的單位:位元組流和字元流。位元組流繼承於InputStream和OutputStream,字元流繼承於
InputStreamReader和OutputStreamWriter。

位元組流如何轉換為字元流

位元組輸入流轉字元輸入流通過InputStreamReader實現,該類的建構函式可以傳入 InputStream

物件。
位元組輸出流轉字元輸出流通過OutputStreamWriter實現,該類的建構函式可以傳入 OutputStream 物件。

如何將一個 java 物件序列化到檔案裡?

在 java 中能夠被序列化的類必須先實現Serializable介面,該介面沒有任何抽象方法只是起到一個標記作用。

什麼是 java 序列化,如何實現 java 序列化?

序列化
是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在對物件流進行讀寫操作時所引發的問題。

序列化的實現:將需要被序列化的類實現Serializable

介面 ,該介面沒有需要 實現的方法,implements Serializable只是為了標註該物件是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造
一個 ObjectOutputStream(物件流)物件,接著,使用 ObjectOutputStream 物件的 writeObject(Object obj)方法就可以將引數為 obj的物件寫出(即儲存其狀態),要恢復的話則用輸入流。

如何實現物件克隆?

兩種方式:

  • 實現 Cloneable 介面並重寫 Object 類中的 clone()方法;
  • 實現 Serializable介面,通過物件的序列化和反序列化實現克隆,可以實現真正的深度克隆。

注意:基於序列化和反序列化實現的克隆不僅僅是深度克隆,更重要的是通過泛型限定,可以檢查出要克隆的物件是否支援序列化,這項檢查是編譯器完成的,不是在執行時丟擲異常,這種是方案明顯優於使用 Object 類的 clone
方法克隆物件。讓問題在編譯的時候暴露出來總是好過把問題留到執行時。

位元組流和字元流的區別

位元組流在JDK1.0中就被引進了,用於操作包含ASCII字元的檔案。JAVA也支援其他的字元如Unicode,為了讀取包含Unicode字元的檔案,JAVA語言設計者在JDK1.1中引入了字元流。ASCII作為Unicode的子集,對於英語字元的檔案,可以可以使用位元組流也可以使用字元流。

位元組流有了為啥還要有字元流

字元流是由 Java 虛擬機器將位元組轉換得到的,問題就出在這個過程還算是非常耗時,並且,如果我們不知道編碼型別就很容易出現亂碼問題。所以, I/O 流就乾脆提供了一個直接操作字元的介面,方便我們平時對字元進行流操作。如果音訊檔案、圖片等媒體檔案用位元組流比較好,如果涉及到字元的話使用字元流比較好。

FileInputStream和FileOutputStream是什麼?

這是在拷貝檔案操作的時候,經常用到的兩個類。在處理小檔案的時候,它們效能表現還不錯,在大檔案的時候,最好使用BufferedInputStream (或 BufferedReader) 和 BufferedOutputStream (或 BufferedWriter)

Files的常用方法都有哪些?

  • Files. size():檢視檔案個數。
  • Files. read():讀取檔案。
  • Files. write():寫入檔案。
  • Files. exists():檢測檔案路徑是否存在。
  • Files. createFile():建立檔案。
  • Files. createDirectory():建立資料夾。
  • Files. delete():刪除一個檔案或目錄。
  • Files. copy():複製檔案。
  • Files. move():移動檔案。