本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫
開篇介紹
大家好,我是Java面試題庫的提褲姐,今天這篇是JavaSE系列的第十四篇,主要總結了Java中的IO流的問題,IO流分為兩篇來講,這篇是第一篇,主要是基本IO流,第二篇主要為網絡IO流,在後續,會沿著第一篇開篇的知識線路一直總結下去,做到日更!如果我能做到百日百更,希望你也可以跟著百日百刷,一百天養成一個好習慣。
Q:
什麼是IO流?
它是一種數據的流從源頭流到目的地。比如文件拷貝,輸入流和輸出流都包括了。輸入流從文件中讀取數據存儲到進程(process)中,輸出流從進程中讀取數據然後寫入到目標文件。
Q:
Java中有幾種類型的流?
按照流的方向:
輸入流(inputStream)輸出流(outputStream)。按照實現功能分:
節點流(可以從或向一個特定的地方(節點)讀寫數據。如FileReader)處理流(是對一個已存在的流的連接和封裝,通過所封裝的流的功能調用實現數據讀寫。如BufferedReader。處理流的構造方法總是要帶一個其他的流對象做參數。一個流對象經過其他流的多次包裝,稱為流的連結。)按照處理數據的單位:
字節流字符流字節流繼承於InputStream和OutputStream
字符流繼承於InputStreamReader和OutputStreamWriter
字符流.png
字節流.png
Q:
字節流和字符流的區別?
字節流在JDK1.0中就被引進了,用於操作包含ASCII字符的文件。JAVA也支持其他的字符如Unicode,為了讀取包含Unicode字符的文件,JAVA語言設計者在JDK1.1中引入了字符流。ASCII作為Unicode的子集,對於英語字符的文件,可以可以使用字節流也可以使用字符流。
Q:
字節流有了為什麼還要有字符流?
字符流是由 Java 虛擬機將字節轉換得到的,問題就出在這個過程還算是非常耗時,並且,如果我們不知道編碼類型就很容易出現亂碼問題。所以, I/O 流就乾脆提供了一個直接操作字符的接口,方便我們平時對字符進行流操作。如果音頻文件、圖片等媒體文件用字節流比較好,如果涉及到字符的話使用字符流比較好。
Q:
FileInputStream和FileOutputStream是什麼?
這是在拷貝文件操作的時候,經常用到的兩個類。在處理小文件的時候,它們性能表現還不錯,在大文件的時候,最好使用BufferedInputStream (或 BufferedReader) 和 BufferedOutputStream (或 BufferedWriter)
Q:
Files的常用方法都有哪些?
Files. size():查看文件個數。Files. read():讀取文件。Files. write():寫入文件。Files. exists():檢測文件路徑是否存在。Files. createFile():創建文件。Files. createDirectory():創建文件夾。Files. delete():刪除一個文件或目錄。Files. copy():複製文件。Files. move():移動文件。
Q:
什麼是 java 序列化,如何實現 java 序列化?
序列化:
是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。
序列化的實現:
將需要被序列化的類實現
Serializable
接口 ,該接口沒有需要 實現的方法,implements Serializable只是為了標註該對象是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個 ObjectOutputStream(對象流)對象,接著,使用 ObjectOutputStream 對象的 writeObject(Object obj)方法就可以將參數為 obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
Q:
如何將一個 java 對象序列化到文件裡?
在 java 中能夠被序列化的類必須先實現
Serializable
接口,該接口沒有任何抽象方法只是起到一個標記作用。
Q:
如何實現對象克隆?
兩種方式:
實現Cloneable 接口並重寫 Object 類中的 clone()方法;實現Serializable接口,通過對象的序列化和反序列化實現克隆,可以實現真正的深度克隆。注意:基於序列化和反序列化實現的克隆不僅僅是深度克隆,更重要的是通過泛型限定,可以檢查出要克隆的對象是否支持序列化,這項檢查是編譯器完成的,不是在運行時拋出異常,這種是方案明顯優於使用 Object 類的clone方法克隆對象。讓問題在編譯的時候暴露出來總是好過把問題留到運行時。