1. 程式人生 > 其它 >JAVA面經-基礎篇-IO流

JAVA面經-基礎篇-IO流

1、介紹下Java中的IO流 IO(Input Output)用於實現對資料的輸入和輸出操作,Java把不同的輸入/輸出源(鍵盤、檔案、網路等)抽象表述為流(Stream)。流是從起源到接收的有序資料,有了它就可以用同一種方式訪問不同的輸入/輸出源。 分類: 1)按照資料流向:分為輸入流和輸出流。輸入流只讀不寫,輸出流只寫不讀。 2)按照資料型別:分為位元組流和字元流。位元組流操作8位的位元組,字元流操作16位的字元。 3)按照處理功能:分為節點流和處理流。節點流可以從/向一個特定的IO裝置輸入/輸出資料,也稱低階流;處理流是對節點流的連線或封裝,簡化資料讀寫功能提高效能,也稱高階流。 常用類: Java提供了大量的類來支援IO操作,下表給大家整理了其中比較常用的一些類。其中,黑色字型的是抽象基類,其他所有的類都繼承自它們。紅色字型的是節點流,藍色字型的是處理流。 根據命名很容易理解各個流的作用:
  • 以File開頭的檔案流用於訪問檔案;
  • 以ByteArray/CharArray開頭的流用於訪問記憶體中的陣列;
  • 以Piped開頭的管道流用於訪問管道,實現程序之間的通訊;
  • 以String開頭的流用於訪問記憶體中的字串;
  • 以Buffered開頭的緩衝流,用於在讀寫資料時對資料進行快取,以減少IO次數;
  • InputStreamReader、InputStreamWriter是轉換流,用於將位元組流轉換為字元流;
  • 以Object開頭的流是物件流,用於實現物件的序列化;
  • 以Print開頭的流是列印流,用於簡化列印操作;
  • 以Pushback開頭的流是推回輸入流,用於將已讀入的資料推回到緩衝區,從而實現再次讀取;
  • 以Data開頭的流是特殊流,用於讀寫Java基本型別的資料。
  2、怎麼用流開啟一個大檔案 開啟大檔案應採用分次讀取的方式。 1. 使用緩衝流。緩衝流內部維護了一個緩衝區,通過緩衝區的互動,減少與裝置互動的次數。 2. 使用NIO。NIO採用對映檔案的方式來處理輸入/輸出。NIO將檔案的一段區域對映到記憶體中,這樣就可以像訪問記憶體一樣訪問檔案了。   3、NIO的實現原理 Java的NIO主要由三個核心部分組成:Channel、Buffer、Selector。 Channel:基本上,所有的IO在NIO中都是從Channel開始的。資料可以從Channel讀到Buffer中, 也可以從Buffer寫到Channel中。 Buffer:本質是一個可讀寫的資料的記憶體。這塊記憶體被包裝成NIO Buffer物件,並提供了一組方法,用於方便的訪問該塊記憶體。 Buffer物件包含三個重要屬性:capacity、position、limit,即容量、當前位置、可用空間 Selector:用於處理多個Channel,當打開了多個連線(通道),但每個連線的流量都很低,使用selector會很方便。   4、Java的序列化和反序列化 序列化機制可以將物件轉化為位元組序列,這些位元組序列(Serialize)可以儲存在磁碟上,可以用於網路傳輸,並允許程式將這些位元組序列再次恢復成原來的物件即反序列化(Deserialize)。若要實現序列化,則需要使用物件流ObjectInputStream和ObjectOutputStream。   5、Serializable介面為什麼要定義serialVersionUID變數 serialVersionUID代表序列化版本,通過定義類的序列化版本,在反序列化時,只要物件中所存的版本和當前版本一樣,就允許做資料恢復操作,否則就有丟擲版本不一致的異常。   6、除了Java自帶的序列化工具,還有哪些 1. JSON:簡單直觀,可讀性好,有jackjson、gjson、fastjson; 2. Protobuf:用來序列化結構化資料的技術,支援多語言,可以使用該技術來持久化資料或化成網路傳輸的資料;優點:節省空間(二進位制流儲存),缺點:支援的資料型別相對較少,不支援常量 3. Thrift:是FaceBook開源提供的一個高效能,輕量級RPC服務框架,解決大資料量、分散式、跨語言、跨平臺的資料通訊需求。   7、如果不用JSON工具,該如何實現對實體類的序列化? 1. 使用Java原生態的序列化機制,但是效率較低,適合小專案 2. 使用其他第三方庫,Protobuf、Thrift、Avro等