解釋一下java.io.Serializable接口java
類經過實現 Java.io.Serializable 接口以啓用其序列化功能。未實現此接口的類將沒法使其任何狀態序列化或反序列化。編程
使用有緩衝的IO類,不要單獨讀取字節或字符設計模式
使用NIO和NIO 2或者AIO,而非BIO緩存
在finally中關閉流服務器
使用內存映射文件獲取更快的IO多線程
Java BIO: 同步並阻塞,服務器實現模式爲一個鏈接一個線程,即客戶端有鏈接請求時服務器端就須要啓動一個線程進行處理,若是這個鏈接不作任何事情會形成沒必要要的線程開銷,固然能夠經過線程池機制改善。架構
Java NIO : 同步非阻塞,服務器實現模式爲一個請求一個線程,即當一個鏈接建立後,不須要對應一個線程,這個鏈接會被註冊到多路複用器上面,因此全部的鏈接只須要一個線程就能夠搞定,當這個線程中的多路複用器進行輪詢的時候,發現鏈接上有請求的話,纔開啓一個線程進行處理,也就是一個請求一個線程模式。BIO與NIO一個比較重要的不一樣,是咱們使用BIO的時候每每會引入多線程,每一個鏈接一個單獨的線程;而NIO則是使用單線程或者只使用少許的多線程,每一個鏈接共用一個線程。併發
Java AIO(NIO.2) : 異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理。app
IO 對 Java 應用的性能很是重要。理想狀況下,你不該該在你應用的關鍵路徑上避免 IO 操做。下面是一些你應該遵循的 Java IO 最佳實踐:異步
使用有緩衝區的 IO 類,而不要單獨讀取字節或字符。
使用 NIO 和 NIO2
在 finally 塊中關閉流,或者使用 try-with-resource 語句。
使用內存映射文件獲取更快的 IO。
BIO(同步並阻塞)方式適用於鏈接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4之前的惟一選擇,但程序直觀簡單易理解。
NIO(同步非阻塞)方式適用於鏈接數目多且鏈接比較短(輕操做)的架構,好比聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。
AIO( 異步非阻塞)方式使用於鏈接數目多且鏈接比較長(重操做)的架構,好比相冊服務器,充分調用OS參與併發操做,編程比較複雜,JDK7開始支持。
面向流與面向緩衝. Java NIO和IO之間第一個最大的區別是,IO是面向流的,NIO是面向緩衝區的。Java IO面向流意味着每次從流中讀一個或多個字節,直至讀取全部字節,它們沒有被緩存在任何地方。此外,它不能先後移動流中的數據。若是須要先後移動從流中讀取的數據,須要先將它緩存到一個緩衝區。 Java NIO的緩衝導向方法略有不一樣。數據讀取到一個它稍後處理的緩衝區,須要時可在緩衝區中先後移動。這就增長了處理過程當中的靈活性。
阻塞與非阻塞IO Java IO的各類流是阻塞的。這意味着,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據徹底寫入。該線程在此期間不能再幹任何事情了。 Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,可是它僅能獲得目前可用的數據,若是目前沒有數據可用時,該線程能夠繼續作其餘的事情。 非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不須要等待它徹底寫入,這個線程同時能夠去作別的事情。線程一般將非阻塞IO的空閒時間用於在其它通道上執行IO操做,因此一個單獨的線程如今能夠管理多個輸入和輸出通道(channel)。
選擇器(Selectors) Java NIO的選擇器容許一個單獨的線程來監視多個輸入通道,你能夠註冊多個通道使用一個選擇器,而後使用一個單獨的線程來「選擇」通道:這些通道里已經有能夠處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。
Java I/O庫的整體設計是符合裝飾模式和適配器模式的。如前所述,這個庫中處理流的類叫流類。
裝飾模式(Decorator):在由InputStream、OutputStream、Reader和Writer表明的等級結構內部,有一些流處理器能夠對另外一些流處理器起到裝飾做用,造成新的、具備改善了的功能的流處理器。
適配器模式(Adapter):在由InputStream、OutputStream、Reader和Writer表明的等級結構內部,有一些流處理器是對其餘類型的流處理器的適配。這就是適配器的應用。