java基础IO BIO、NIO、AIO的区别
????Java IO(Java數據流)主要就是Java用來讀取和輸出數據流。它有對應的一系列API。主要是java.io.*,和java.nio.*。
????? ? Java中IO主要有兩類
????????????|——>字節流(讀寫以字節(8bit)為單位,InputStream和OutputStream為主要代表?????????????????????????? ? ?????????
????????????|——>字符流(讀寫以字符為單位,Reader和Writer為主要代表)?
???????
????????在使用中:讀取純文本數據優選用字符流,其他使用字節流。因為字符流是以虛擬機的encode來處理,一次能讀多個字節;而圖片和視頻類的文件是根據二進制進行存儲,當用字符流處理的時候有些會找不到映射的碼表,會造成數據缺失。
????????下面介紹下經常用到的io類:
????????????基本流:從特定的地方讀寫的流類,如磁盤或一塊內存區域。既有來源。
???????????????|——>FileInputStream/FileOutputStream(文件字節輸出流)、
????????????處理流(高級流,過濾流):沒有數據源,不能獨立存在,它的存在是用于處理基本流的,是使用一個已經存在的輸入流或輸出流連接創建。
???????????????|——>BufferedOutputStream/BufferdInputStream(緩沖字節高級流),內部維護者一個緩沖區,每次都盡可能的讀取更多的字節放入到緩沖區,再將緩沖區中的內容部分或全部返回給用戶,因此可以提高讀寫效率。
???????????????|——>DataOutputStream/DataInputStream(基本數據類型高級流)
???????????????|——>OutputStreamWriter/InputStreamReader(字符高級流)
???????????????|——>BufferWriter/BufferReader(緩沖字符高級流)
?????????????? |——>FileWriter/FileReader(文件字符高級流),用于讀寫“文本文件”
?BIO、NIO、AIO的區別
????? ??BIO:同步并阻塞。服務器實現模式為:一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
????? ??NIO:同步非阻塞。服務器實現模式為:一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。
????? ? AIO:異步非阻塞。服務器實現模式為:一個有效請求一個線程,即客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理。
? ? NIO比BIO把一些無效的連接擋在了啟動線程之前,減少了這部分資源的浪費。因為我們都知道每創建一個線程,就要為這個線程分配一定的內存空間。
? ? AIO比NIO進一步改善是,將一些暫時可能無效的請求擋在了啟動線程之前,比如在NIO的處理方式中,當一個請求來的話,開啟線程進行處理,但這個請求所需要的資源還沒有就緒,此時必須等待后端的應用資源,這時線程就被阻塞了。
適用范圍:
? ? BIO 適用于連接數目比較小且固定的結構。它對服務器資源要求比較高,并發局限于應用中,JDK1.4之前唯一選擇,但程序直觀簡單易理解,如之前在Apache中使用。
????NIO 適用于連接數目多且連接比較短的架構,比如聊天服務器,并發局限于應用中,變成比較復雜。JDK1.4開始支持,如在Nginx,Netty中使用。
? ? AIO 適用于連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與并發操作,編程比較復雜,JDK7開始支持,在成長中,Netty曾經使用過,后來放棄。
????????
總結
以上是生活随笔為你收集整理的java基础IO BIO、NIO、AIO的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础 正则表达式 Patter
- 下一篇: java.lang.Unsupporte