java面試題 --- IO

1. IO流的分類有哪些?

  • 按照流向分爲輸入流和輸出流;
  • 按照實現功能分爲節點流和處理流。節點就是從一個特定的地方讀寫數據,包括數組操作,管道操作和文件操作;處理流對已存在的流進行封裝和處理,包括緩衝操作,打印操作和轉化操作等;
  • 按照處理數據的單位分爲字節流和字符流

2. 爲什麼有字節流還要有字符流?

  • 字節流是 java 用來 ASCII 字符文件的,但 java 也支持其他字符,比如 unicode,爲了方便操作字符且不會亂碼,就提供了字符流。

3. 什麼是 java 序列化?

  • 將對象進行流化,對流化後的對象進行讀寫操作或者網絡傳輸。要序列化的對象必須實現 Serializable 接口。

4. 對象序列化的過程是什麼?

  • 用輸出流構造一個 ObjectOutputStream 對象,然後調用其 writeObject(Object obj) 方法即可將對象轉化成流,反序列化就是用輸入流。

5. 如何克隆對象?

  • 重寫 Object 的 clone 方法;
  • 通過序列化和反序列化克隆。

6. BIO、NIO 和 AIO 有什麼區別?

  • BIO 是同步阻塞 IO,併發性不好;
  • NIO 是同步非阻塞 IO,JDK1.4 開始引入,基於通道和緩衝區操作,實現了 IO 多路複用;
  • AIO 是異步非阻塞 IO,併發性很好,基於事件和回調機制,目前還未廣泛使用。

7. 說說你對 NIO 的認識?

NIO 的核心就是緩衝區(Buffer)、通道(Channel)和選擇器(Selector)。

(1). 緩衝區(Buffer)就是用來存儲數據的,八種基本類型只有 Boolean 類型沒有提供對應的緩衝區。

  • 核心屬性:capacity,緩衝區的容量;limit,界線,緩衝區可用區域和已用區域的分界線;position,當前的位置。
  • 核心方法:allocate,分配緩衝區;put,往緩衝區寫數據;get,從緩衝區讀數據;

(2). 通道(Channel)就是源位置與目標位置之間打開的連接,數據傳輸的通路。

  • 核心實現類:FileChannel,操作文件的通道;DatagramChannel,通過 UDP 讀取網絡數據的通道;SocketChannel,通過 TCP 讀取網絡數據的通道;ServerSocketChannel,監聽 TCP 連接的通道。
  • 核心方法:transferTo/transferFrom,通道間的數據傳輸;write,將緩衝區數據寫入通道;read,把通道數據讀取到緩衝區。

(3). 選擇器用於IO多路複用,將channel都註冊到選擇器上,它會監聽哪些通道有事件發生,然後進行處理。


8. 知道零拷貝嗎?

  • 首先普通拷貝的過程是,源文件先經過 DMA 拷貝到內核 buffer,然後通過 CPU 拷貝到用戶 buffer,接着再通過 CPU 拷貝到 socket buffer,最後通過 DMA 拷貝到協議棧。這裏經過了四次拷貝,並且伴隨着三次用戶態的轉換,用戶態轉爲內核態,再轉爲用戶態,最後又轉爲內核態。
  • 零拷貝不是不拷貝,是可以不經過用戶 buffer,直接從內核 buffer 通過 CPU 拷貝到 socket buffer,且這裏拷貝的內容非常少,只拷貝長度、偏移量等信息。通過 linux 的 sendFile 函數即可實現零拷貝。java NIO 中的 transferFrom/transferTo 方法就通過 sendFile 函數實現了零拷貝。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章