java基础IO BIO、NIO、AIO的区别
????Java IO(Java數(shù)據(jù)流)主要就是Java用來(lái)讀取和輸出數(shù)據(jù)流。它有對(duì)應(yīng)的一系列API。主要是java.io.*,和java.nio.*。
????? ? Java中IO主要有兩類
????????????|——>字節(jié)流(讀寫(xiě)以字節(jié)(8bit)為單位,InputStream和OutputStream為主要代表?????????????????????????? ? ?????????
????????????|——>字符流(讀寫(xiě)以字符為單位,Reader和Writer為主要代表)?
???????
????????在使用中:讀取純文本數(shù)據(jù)優(yōu)選用字符流,其他使用字節(jié)流。因?yàn)樽址魇且?span style="background-color:rgb(255,255,255);color:rgb(51,51,51);font-family:'PingFang SC', 'Lantinghei SC', 'Microsoft YaHei', arial, '宋體', sans-serif, tahoma;white-space:pre-wrap;">虛擬機(jī)的encode來(lái)處理,一次能讀多個(gè)字節(jié);而圖片和視頻類的文件是根據(jù)二進(jìn)制進(jìn)行存儲(chǔ),當(dāng)用字符流處理的時(shí)候有些會(huì)找不到映射的碼表,會(huì)造成數(shù)據(jù)缺失。
????????下面介紹下經(jīng)常用到的io類:
????????????基本流:從特定的地方讀寫(xiě)的流類,如磁盤(pán)或一塊內(nèi)存區(qū)域。既有來(lái)源。
???????????????|——>FileInputStream/FileOutputStream(文件字節(jié)輸出流)、
????????????處理流(高級(jí)流,過(guò)濾流):沒(méi)有數(shù)據(jù)源,不能獨(dú)立存在,它的存在是用于處理基本流的,是使用一個(gè)已經(jīng)存在的輸入流或輸出流連接創(chuàng)建。
???????????????|——>BufferedOutputStream/BufferdInputStream(緩沖字節(jié)高級(jí)流),內(nèi)部維護(hù)者一個(gè)緩沖區(qū),每次都盡可能的讀取更多的字節(jié)放入到緩沖區(qū),再將緩沖區(qū)中的內(nèi)容部分或全部返回給用戶,因此可以提高讀寫(xiě)效率。
???????????????|——>DataOutputStream/DataInputStream(基本數(shù)據(jù)類型高級(jí)流)
???????????????|——>OutputStreamWriter/InputStreamReader(字符高級(jí)流)
???????????????|——>BufferWriter/BufferReader(緩沖字符高級(jí)流)
?????????????? |——>FileWriter/FileReader(文件字符高級(jí)流),用于讀寫(xiě)“文本文件”
?BIO、NIO、AIO的區(qū)別
????? ??BIO:同步并阻塞。服務(wù)器實(shí)現(xiàn)模式為:一個(gè)連接一個(gè)線程,即客戶端有連接請(qǐng)求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線程進(jìn)行處理,如果這個(gè)連接不做任何事情會(huì)造成不必要的線程開(kāi)銷(xiāo),當(dāng)然可以通過(guò)線程池機(jī)制改善。
????? ??NIO:同步非阻塞。服務(wù)器實(shí)現(xiàn)模式為:一個(gè)請(qǐng)求一個(gè)線程,即客戶端發(fā)送的連接請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器上,多路復(fù)用器輪詢到連接有I/O請(qǐng)求時(shí)才啟動(dòng)一個(gè)線程進(jìn)行處理。
????? ? AIO:異步非阻塞。服務(wù)器實(shí)現(xiàn)模式為:一個(gè)有效請(qǐng)求一個(gè)線程,即客戶端的I/O請(qǐng)求都是由OS先完成了再通知服務(wù)器應(yīng)用去啟動(dòng)線程進(jìn)行處理。
? ? NIO比BIO把一些無(wú)效的連接擋在了啟動(dòng)線程之前,減少了這部分資源的浪費(fèi)。因?yàn)槲覀兌贾烂縿?chuàng)建一個(gè)線程,就要為這個(gè)線程分配一定的內(nèi)存空間。
? ? AIO比NIO進(jìn)一步改善是,將一些暫時(shí)可能無(wú)效的請(qǐng)求擋在了啟動(dòng)線程之前,比如在NIO的處理方式中,當(dāng)一個(gè)請(qǐng)求來(lái)的話,開(kāi)啟線程進(jìn)行處理,但這個(gè)請(qǐng)求所需要的資源還沒(méi)有就緒,此時(shí)必須等待后端的應(yīng)用資源,這時(shí)線程就被阻塞了。
適用范圍:
? ? BIO 適用于連接數(shù)目比較小且固定的結(jié)構(gòu)。它對(duì)服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中,JDK1.4之前唯一選擇,但程序直觀簡(jiǎn)單易理解,如之前在Apache中使用。
????NIO 適用于連接數(shù)目多且連接比較短的架構(gòu),比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中,變成比較復(fù)雜。JDK1.4開(kāi)始支持,如在Nginx,Netty中使用。
? ? AIO 適用于連接數(shù)目多且連接比較長(zhǎng)(重操作)的架構(gòu),比如相冊(cè)服務(wù)器,充分調(diào)用OS參與并發(fā)操作,編程比較復(fù)雜,JDK7開(kāi)始支持,在成長(zhǎng)中,Netty曾經(jīng)使用過(guò),后來(lái)放棄。
????????
總結(jié)
以上是生活随笔為你收集整理的java基础IO BIO、NIO、AIO的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java基础 正则表达式 Patter
- 下一篇: 天翼云从业认证(1.2)存储的概念、体系