国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java-IO&NIO

這篇具有很好參考價值的文章主要介紹了java-IO&NIO。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、JAVA IO

1.1. 阻塞 IO 模型

??最傳統(tǒng)的一種 IO 模型,即在讀寫數(shù)據(jù)過程中會發(fā)生阻塞現(xiàn)象。當(dāng)用戶線程發(fā)出 IO 請求之后,內(nèi)
核會去查看數(shù)據(jù)是否就緒,如果沒有就緒就會等待數(shù)據(jù)就緒,而用戶線程就會處于阻塞狀態(tài),用戶線程交出 CPU。當(dāng)數(shù)據(jù)就緒之后,內(nèi)核會將數(shù)據(jù)拷貝到用戶線程,并返回結(jié)果給用戶線程,用戶線程才解除 block 狀態(tài)。典型的阻塞 IO 模型的例子為:data = socket.read();如果數(shù)據(jù)沒有就
緒,就會一直阻塞在 read 方法。

1.2. 非阻塞 IO 模型

??當(dāng)用戶線程發(fā)起一個 read 操作后,并不需要等待,而是馬上就得到了一個結(jié)果。如果結(jié)果是一個error 時,它就知道數(shù)據(jù)還沒有準(zhǔn)備好,于是它可以再次發(fā)送 read 操作。一旦內(nèi)核中的數(shù)據(jù)準(zhǔn)備好了,并且又再次收到了用戶線程的請求,那么它馬上就將數(shù)據(jù)拷貝到了用戶線程,然后返回。所以事實上,在非阻塞 IO 模型中,用戶線程需要不斷地詢問內(nèi)核數(shù)據(jù)是否就緒,也就說非阻塞 IO不會交出 CPU,而會一直占用 CPU。典型的非阻塞 IO 模型一般如下:

while(true){
data = socket.read();
if(data!= error){
處理數(shù)據(jù)
break;
}
}

??但是對于非阻塞 IO 就有一個非常嚴(yán)重的問題,在 while 循環(huán)中需要不斷地去詢問內(nèi)核數(shù)據(jù)是否就緒,這樣會導(dǎo)致 CPU 占用率非常高,因此一般情況下很少使用 while 循環(huán)這種方式來讀取數(shù)據(jù)。

1.3. 多路復(fù)用 IO 模型

??多路復(fù)用 IO 模型是目前使用得比較多的模型。Java NIO 實際上就是多路復(fù)用 IO。在多路復(fù)用 IO模型中,會有一個線程不斷去輪詢多個 socket 的狀態(tài),只有當(dāng) socket 真正有讀寫事件時,才真正調(diào)用實際的 IO 讀寫操作。因為在多路復(fù)用 IO 模型中,只需要使用一個線程就可以管理多個socket,系統(tǒng)不需要建立新的進(jìn)程或者線程,也不必維護(hù)這些線程和進(jìn)程,并且只有在真正有socket 讀寫事件進(jìn)行時,才會使用 IO 資源,所以它大大減少了資源占用。在 Java NIO 中,是通過 selector.select()去查詢每個通道是否有到達(dá)事件,如果沒有事件,則一直阻塞在那里,因此這種方式會導(dǎo)致用戶線程的阻塞。多路復(fù)用 IO 模式,通過一個線程就可以管理多個 socket,只有當(dāng)socket 真正有讀寫事件發(fā)生才會占用資源來進(jìn)行實際的讀寫操作。因此,多路復(fù)用 IO 比較適合連接數(shù)比較多的情況。
??另外多路復(fù)用 IO 為何比非阻塞 IO 模型的效率高是因為在非阻塞 IO 中,不斷地詢問 socket 狀態(tài)時通過用戶線程去進(jìn)行的,而在多路復(fù)用 IO 中,輪詢每個 socket 狀態(tài)是內(nèi)核在進(jìn)行的,這個效率要比用戶線程要高的多。
??不過要注意的是,多路復(fù)用 IO 模型是通過輪詢的方式來檢測是否有事件到達(dá),并且對到達(dá)的事件逐一進(jìn)行響應(yīng)。因此對于多路復(fù)用 IO 模型來說,一旦事件響應(yīng)體很大,那么就會導(dǎo)致后續(xù)的事件遲遲得不到處理,并且會影響新的事件輪詢。

1.4. 信號驅(qū)動 IO 模型

??在信號驅(qū)動 IO 模型中,當(dāng)用戶線程發(fā)起一個 IO 請求操作,會給對應(yīng)的 socket 注冊一個信號函數(shù),然后用戶線程會繼續(xù)執(zhí)行,當(dāng)內(nèi)核數(shù)據(jù)就緒時會發(fā)送一個信號給用戶線程,用戶線程接收到信號之后,便在信號函數(shù)中調(diào)用 IO 讀寫操作來進(jìn)行實際的 IO 請求操作。

1.5. 異步 IO 模型

??異步 IO 模型才是最理想的 IO 模型,在異步 IO 模型中,當(dāng)用戶線程發(fā)起 read 操作之后,立刻就可以開始去做其它的事。而另一方面,從內(nèi)核的角度,當(dāng)它受到一個 asynchronous read 之后,它會立刻返回,說明 read 請求已經(jīng)成功發(fā)起了,因此不會對用戶線程產(chǎn)生任何 block。然后,內(nèi)核會等待數(shù)據(jù)準(zhǔn)備完成,然后將數(shù)據(jù)拷貝到用戶線程,當(dāng)這一切都完成之后,內(nèi)核會給用戶線程發(fā)送一個信號,告訴它 read 操作完成了。也就說用戶線程完全不需要實際的整個 IO 操作是如何
進(jìn)行的,只需要先發(fā)起一個請求,當(dāng)接收內(nèi)核返回的成功信號時表示 IO 操作已經(jīng)完成,可以直接去使用數(shù)據(jù)了。
??也就說在異步 IO 模型中,IO 操作的兩個階段都不會阻塞用戶線程,這兩個階段都是由內(nèi)核自動完成,然后發(fā)送一個信號告知用戶線程操作已完成。用戶線程中不需要再次調(diào)用 IO 函數(shù)進(jìn)行具體的讀寫。這點是和信號驅(qū)動模型有所不同的,在信號驅(qū)動模型中,當(dāng)用戶線程接收到信號表示數(shù)據(jù)已經(jīng)就緒,然后需要用戶線程調(diào)用 IO 函數(shù)進(jìn)行實際的讀寫操作;而在異步 IO 模型中,收到信號表示 IO 操作已經(jīng)完成,不需要再在用戶線程中調(diào)用 IO 函數(shù)進(jìn)行實際的讀寫操作。
??注意,異步 IO 是需要操作系統(tǒng)的底層支持,在 Java 7 中,提供了 Asynchronous IO。
java-IO&NIO,Java,java,nio,網(wǎng)絡(luò)

二、JAVA NIO

??NIO 主要有三大核心部分:Channel(通道),Buffer(緩沖區(qū)), Selector。傳統(tǒng) IO 基于字節(jié)流和字符流進(jìn)行操作,而 NIO 基于 Channel 和 Buffer(緩沖區(qū))進(jìn)行操作,數(shù)據(jù)總是從通道讀取到緩沖區(qū)中,或者從緩沖區(qū)寫入到通道中。Selector(選擇區(qū))用于監(jiān)聽多個通道的事件(比如:連接打開,數(shù)據(jù)到達(dá))。因此,單個線程可以監(jiān)聽多個數(shù)據(jù)通道。

??NIO 和傳統(tǒng) IO 之間第一個最大的區(qū)別是,IO 是面向流的,NIO 是面向緩沖區(qū)的。

2.1. NIO 的緩沖區(qū)

?? Java IO 面向流意味著每次從流中讀一個或多個字節(jié),直至讀取所有字節(jié),它們沒有被緩存在任何地方。此外,它不能前后移動流中的數(shù)據(jù)。如果需要前后移動從流中讀取的數(shù)據(jù),需要先將它緩存到一個緩沖區(qū)。NIO 的緩沖導(dǎo)向方法不同。數(shù)據(jù)讀取到一個它稍后處理的緩沖區(qū),需要時可在緩沖區(qū)中前后移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區(qū)中包含所有您需要處理的數(shù)據(jù)。而且,需確保當(dāng)更多的數(shù)據(jù)讀入緩沖區(qū)時,不要覆蓋緩沖區(qū)里尚未處理的數(shù)據(jù)。

2.2. NIO 的非阻塞

??IO 的各種流是阻塞的。這意味著,當(dāng)一個線程調(diào)用 read() 或 write()時,該線程被阻塞,直到有一些數(shù)據(jù)被讀取,或數(shù)據(jù)完全寫入。該線程在此期間不能再干任何事情了。 NIO 的非阻塞模式,使一個線程從某通道發(fā)送請求讀取數(shù)據(jù),但是它僅能得到目前可用的數(shù)據(jù),如果目前沒有數(shù)據(jù)可用時,就什么都不會獲取。而不是保持線程阻塞,所以直至數(shù)據(jù)變的可以讀取之前,該線程可以繼續(xù)做其他的事情。 非阻塞寫也是如此。一個線程請求寫入一些數(shù)據(jù)到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。 線程通常將非阻塞 IO 的空閑時間用于在其它通道上執(zhí)行 IO 操作,所以一個單獨的線程現(xiàn)在可以管理多個輸入和輸出通道(channel)。

2.3. Channel

??首先說一下 Channel,國內(nèi)大多翻譯成“通道”。Channel 和 IO 中的 Stream(流)是差不多一個等級的。只不過 Stream 是單向的,譬如:InputStream, OutputStream,而 Channel 是雙向的,既可以用來進(jìn)行讀操作,又可以用來進(jìn)行寫操作。NIO 中的 Channel 的主要實現(xiàn)有:

  1. FileChannel
  2. DatagramChannel
  3. SocketChannel
  4. ServerSocketChannel
    這里看名字就可以猜出個所以然來:分別可以對應(yīng)文件 IO、UDP 和 TCP(Server 和 Client)。

2.4. Buffer

??Buffer,故名思意,緩沖區(qū),實際上是一個容器,是一個連續(xù)數(shù)組。Channel 提供從文件、網(wǎng)絡(luò)讀取數(shù)據(jù)的渠道,但是讀取或?qū)懭氲臄?shù)據(jù)都必須經(jīng)由 Buffer。
java-IO&NIO,Java,java,nio,網(wǎng)絡(luò)

??上面的圖描述了從一個客戶端向服務(wù)端發(fā)送數(shù)據(jù),然后服務(wù)端接收數(shù)據(jù)的過程??蛻舳税l(fā)送數(shù)據(jù)時,必須先將數(shù)據(jù)存入 Buffer 中,然后將 Buffer 中的內(nèi)容寫入通道。服務(wù)端這邊接收數(shù)據(jù)必須通過 Channel 將數(shù)據(jù)讀入到 Buffer 中,然后再從 Buffer 中取出數(shù)據(jù)來處理。在 NIO 中,Buffer 是一個頂層父類,它是一個抽象類,常用的 Buffer 的子類有:ByteBuffer、IntBuffer、 CharBuffer、 LongBuffer、 DoubleBuffer、FloatBuffer、ShortBuffer

2.5. Selector

??Selector 類是 NIO 的核心類,Selector 能夠檢測多個注冊的通道上是否有事件發(fā)生,如果有事件發(fā)生,便獲取事件然后針對每個事件進(jìn)行相應(yīng)的響應(yīng)處理。這樣一來,只是用一個單線程就可以管理多個通道,也就是管理多個連接。這樣使得只有在連接真正有讀寫事件發(fā)生時,才會調(diào)用函數(shù)來進(jìn)行讀寫,就大大地減少了系統(tǒng)開銷,并且不必為每個連接都創(chuàng)建一個線程,不用去維護(hù)多個線程,并且避免了多線程之間的上下文切換導(dǎo)致的開銷。文章來源地址http://www.zghlxwxcb.cn/news/detail-661429.html

到了這里,關(guān)于java-IO&NIO的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java NIO原理 (Selector、Channel、Buffer、零拷貝、IO多路復(fù)用)

    Java NIO原理 (Selector、Channel、Buffer、零拷貝、IO多路復(fù)用)

    系列文章目錄和關(guān)于我 最近有很多想學(xué)的,像netty的使用、原理源碼,但是苦于自己對于操作系統(tǒng)和nio了解不多,有點無從下手,遂學(xué)習(xí)之。 上圖粗略描述了網(wǎng)絡(luò)io的過程,了解其中的拷貝過程有利于我們理解非阻塞io,以及IO多路復(fù)用的必要性。 數(shù)據(jù)從網(wǎng)卡到內(nèi)核緩沖區(qū) 網(wǎng)

    2024年02月08日
    瀏覽(21)
  • java網(wǎng)絡(luò)編程——NIO架構(gòu)

    java網(wǎng)絡(luò)編程——NIO架構(gòu)

    目錄 1.什么是NIO 2.NIO結(jié)構(gòu) 3.基于NIO下的聊天系統(tǒng)實現(xiàn) 4.Netty NIO:java non-blocking IO,同步非阻塞IO。 BIO是阻塞IO,即每一個事件都需要分配一個進(jìn)程給他,如果客戶端沒有連接上,則一直阻塞等待。 而NIO,異步 I/O 是一種沒有阻塞地讀寫數(shù)據(jù)的方法:該架構(gòu)下我們可以注冊對特定

    2023年04月26日
    瀏覽(23)
  • 快速入門java網(wǎng)絡(luò)編程基礎(chǔ)------Nio

    快速入門java網(wǎng)絡(luò)編程基礎(chǔ)------Nio

    嗶哩嗶哩黑馬程序員 netty實戰(zhàn)視頻 NIO(New I/O)是Java中提供的一種基于通道和緩沖區(qū)的I/O(Input/Output)模型。它是相對于傳統(tǒng)的IO(InputStream和OutputStream)模型而言的新型I/O模型。NIO的主要特點包括: 1.通道與緩沖區(qū): 2.NIO引入了通道(Channel)和緩沖區(qū)(Buffer)的概念。通道

    2024年01月20日
    瀏覽(29)
  • Java 網(wǎng)絡(luò)編程之NIO(selector)

    Java 網(wǎng)絡(luò)編程之NIO(selector)

    ? ? ? ? ? ? ? ?? ? ?本編文章意在循環(huán)漸進(jìn),可看最后一個就可以了 ? ? ? ? ? ? ? ?Selector selector = Selector.open(); ? ? ? ? ? ? ? ?首先channel必須是非阻塞的情況下 ? ? ? ? ? ? ? ? channel.register(選擇器,操作的類型,綁定的組件);返回的是選擇鍵? ? ? ? ? ? ? 1)Ch

    2023年04月11日
    瀏覽(22)
  • Java網(wǎng)絡(luò)編程-深入理解BIO、NIO

    Java網(wǎng)絡(luò)編程-深入理解BIO、NIO

    BIO BIO 為 Blocked-IO(阻塞 IO),在 JDK1.4 之前建立網(wǎng)絡(luò)連接時,只能使用 BIO 使用 BIO 時,服務(wù)端會對客戶端的每個請求都建立一個線程進(jìn)行處理,客戶端向服務(wù)端發(fā)送請求后,先咨詢服務(wù)端是否有線程響應(yīng),如果沒有就會等待或者被拒絕 BIO 基本使用代碼: 服務(wù)端: 客戶端:

    2024年02月04日
    瀏覽(24)
  • Java網(wǎng)絡(luò)編程----通過實現(xiàn)簡易聊天工具來聊聊NIO

    Java網(wǎng)絡(luò)編程----通過實現(xiàn)簡易聊天工具來聊聊NIO

    前文我們說過了BIO,今天我們聊聊NIO。 NIO 是什么?NIO官方解釋它為 New lO ,由于其特性我們也稱之為,Non-Blocking IO。這是jdk1.4之后新增的一套IO標(biāo)準(zhǔn)。 為什么要用NIO呢? 我們再簡單回顧下BIO: 阻塞式IO,原理很簡單,其實就是多個端點與服務(wù)端進(jìn)行通信時,每個客戶端有一個

    2024年02月05日
    瀏覽(20)
  • Java網(wǎng)絡(luò)編程(二)NIO和Netty實現(xiàn)多人聊天功能
  • 快速入門Java NIO(Not I/O)的網(wǎng)絡(luò)通信框架--Netty

    快速入門Java NIO(Not I/O)的網(wǎng)絡(luò)通信框架--Netty

    了解netty前需要對nio有一定認(rèn)識,該筆記基礎(chǔ)來自bilinbili黑馬,在此基礎(chǔ)上自己學(xué)習(xí)的筆記,添加了一些自己的理解 了解java 非阻塞io編程 1.1 Netty 是什么? Netty 是一個異步(基于多線程)的、基于事件驅(qū)動(多路復(fù)用的那寫事件驅(qū)動)的網(wǎng)絡(luò)應(yīng)用框架,用于快速開發(fā)可維護(hù)、高性能的

    2024年01月17日
    瀏覽(25)
  • Java-IO流基礎(chǔ)知識

    Java-IO流基礎(chǔ)知識

    目錄 1.File類與路徑知識 1.File類 2.Java中的路徑知識 3.創(chuàng)建File類的實例 4.File類的方法使用 5.File類使用的注意點 2.IO流知識 1.IO流原理 2.文件的讀入 3.read()的重載方法:難點 4.文件的寫出 1.寫出的說明 2.寫出操作的具體步驟 5.文件的復(fù)制:先讀出在寫入 6.字節(jié)流FileInputStream和Fi

    2024年02月09日
    瀏覽(51)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包