Java面試總結——輸入輸出流

1.java中有幾種類型的流?

JDK提供的流繼承了四大類:
  InputStream(字節輸入流),OutputStream(字節輸出流),Reader(字符輸入流),Writer(字符輸出流)。
  (1)根據處理數據的類型不同,流可以分爲兩大類:
  字節流以字節(8位二進制)爲單位進行處理。主要用於讀寫諸如圖像或聲音的二進制數據。
   字符流以字符(16位二進制)爲單位進行處理。
  後綴是Stream是字節流,而後綴是Reader,Writer是字符流。
(2)按照功能分類:
  節點流:從特定的地方讀寫的流類,如磁盤或者一塊內存區域。
  過濾流:使用節點流作爲輸入或輸出。過濾流是使用一個已經存在的輸入流或者輸出流連接創建的。

2.Java Socket是什麼

網絡上兩個程序通過一個雙向的通信連接實現數據的交換,這個雙向鏈路的一端稱爲一個socket。
Socket可以分爲兩種類型:面向連接的Socket通信協議(tcp)面向無連接的Socket通信協議(udp)。
典型的TCP客戶端要經過下面三步操作:

  • 創建一個Socket實例:構造函數向指定的遠程主機和端口建立一個TCP連接

  • 通過套接字的I/O流與服務端通信

  • 使用Socket類的close方法關閉連接
    Server端和Client端都可以通過Send、Write等方法與對方通信。

3.java NIO是什麼

NIO(Nonblocking IO)
Java NIO 由以下幾個核心部分組成:

  • Channels

  • Buffers

  • Selectors
    Channel 和 Buffer
      基本上,所有的 IO 在NIO 中都從一個Channel 開始。Channel 有點象流。 數據可以從Channel讀到Buffer中,也可以從Buffer 寫到Channel中。這裏有個圖示:
      在這裏插入圖片描述
      Channel和Buffer有好幾種類型。下面是JAVA NIO中的一些主要Channel的實現:

  • FileChannel

  • DatagramChannel

  • SocketChannel

  • ServerSocketChannel

正如你所看到的,這些通道涵蓋了UDP 和 TCP 網絡IO,以及文件IO。
與這些類一起的有一些有趣的接口,但爲簡單起見,我儘量在概述中不提到它們。本教程其它章節與它們相關的地方我會進行解釋。

以下是Java NIO裏關鍵的Buffer實現:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

這些Buffer覆蓋了你能通過IO發送的基本數據類型:byte, short, int, long, float, double 和 char。
Selector
Selector允許單線程處理多個Channel,如果你的應用打開了多個連接(通道),但每個連接的流量都很低,使用Selector就會很方便。例如,在一個聊天服務器中。
Selector內部的實現原理:對所有註冊的channel進行輪詢訪問,一旦輪詢到一個channel1有註冊的事件發生,通過selection-key的方式來通知開發人員對channel1進行數據的讀寫。這種輪詢的方式在處理多線程請求時不需要上下文的切換。而採用多線程的實現方式需要在線程之間切換時需要上下文切換,同時需要進行壓棧和彈棧操作,因此NIO效率較高。
java NIO和IO的主要區別

IO NIO
面向流 面向緩衝
阻塞 非阻塞
選擇器
4.什麼是java 的序列化(串行化)?

簡單說就是爲了保存在內存中的各種對象的狀態(也就是實例變量,不是方法),並且可以把保存的對象狀態再讀出來。雖然你可以用你自己的各種各樣的方法來保存object states,但是Java給你提供一種應該比你自己好的保存對象狀態的機制,那就是序列化。
什麼情況下需要序列化?序列化的注意事項,如何實現java 序列化(串行化)?

  • 當你想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;
  • 當你想用套接字在網絡上傳送對象的時候;
  • 當你想通過RMI傳輸對象的時候;
    序列化注意事項:
  • 如果子類實現Serializable接口而父類未實現時,父類不會被序列化,但此時父類必須有個無參構造方法,否則會拋InvalidClassException異常
  • 靜態變量不會被序列化,那是類的“菜”,不是對象的。串行化保存的是對象的狀態,即非靜態的屬性,即實例變量。不能保存類變量
  • transient關鍵字修飾變量可以限制序列化。對於不需要或不應該保存的屬性,應加上transient修飾符。要串行化的對象的類必須是公開的(public)
  • 虛擬機是否允許反序列化,不僅取決於類路徑和功能代碼是否一致,一個非常重要的一點是兩個類的序列化 ID是否一致,就是 privatestatic final long serialVersionUID = 1L
  • Java序列化機制爲了節省磁盤空間,具有特定的存儲規則,當寫入文件的爲同一對象時,並不會再將對象的內容進行存儲,而只是再次存儲一份引用。反序列化時,恢復引用關係
  • 序列化到同一個文件時,如第二次修改了相同對象屬性值再次保存時候,虛擬機根據引用關係知道已經有一個相同對象已經寫入文件,因此只保存第二次寫的引用,所以讀取時,都是第一次保存的對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章