簡單了解nio與io的區別與聯系


一、概念

NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。在Java API中提供了兩套NIO,一套是針對標准輸入輸出NIO,另一套就是網絡編程NIO。

二、nio與io的區別

下表總結了Java IO和NIO之間的主要區別:

IO NIO
面向流 面向緩沖區
阻塞IO 非阻塞IO
選擇器(selector)

1、面向流與面向緩沖
Java IO和NIO之間第一個最大的區別是,IO是面向流的,而NIO是面向緩沖區的。
Java IO面向流意味着每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方。此外,它不能前后移動流中的數據。如果需要前后移動從流中讀取的數據,需要先將它緩存到一個緩沖區。
Java NIO的與IO的讀取方法略有不同。NIO將數據讀取到一個它稍后處理的緩沖區中,需要時可在緩沖區中前后移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所有你需要處理的數據,而且需確保當更多的數據讀入緩沖區時,不要覆蓋緩沖區里尚未處理的數據。

2、阻塞與非阻塞IO

Java IO的各種流是阻塞的。這意味着,當一個線程調用read()或write()時,該線程被阻塞直到有一些數據被讀取或數據完全寫入,該線程在此期間不能再干任何事情了。
Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什么都不會獲取,而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。 非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。 線程通常將非阻塞IO的空閑時間用於在其它通道上執行IO操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。
IO的各種流是阻塞的,就是當一個線程調用讀寫方法時,該線程會被阻塞,直到讀寫完,在這期間該線程不能干其他事,CPU轉而去處理其他線程,假如一個線程監聽一個端口,一天只會有幾次請求進來,但是CPU卻不得不為該線程不斷的做上下文切換,並且大部分切換以阻塞告終。
NIO通訊是將整個任務切換成許多小任務,由一個線程負責處理所有io事件,並負責分發。它是利用事件驅動機制,而不是監聽機制,事件到的時候再觸發。NIO線程之間通過wait,notify等方式通訊。保證了每次上下文切換都有意義,減少無謂的進程切換。

3、選擇器(Selectors)
Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以注冊多個通道使用一個選擇器,然后使用一個單獨的線程來“選擇”通道:這些通道里已經有可以處理的輸入,或者選擇已准備寫入的通道。這種選擇機制使得一個單獨的線程很容易來管理多個通道。

java nio原生的三大組件:selector、Channel、ByteBuffer。netty封裝了nio,方便開發者進行網絡io編程。

三、NIO和IO如何影響應用程序的設計

無論您選擇IO或NIO工具箱,可能會影響您應用程序設計的以下幾個方面:
1、對NIO或IO類的API調用。2、數據處理。3、用來處理數據的線程數。

1、API調用
當然,使用NIO的API調用時看起來與使用IO時有所不同,但這並不意外,因為並不是僅從一個InputStream逐字節讀取,而是數據必須先讀入緩沖區再處理。

沒寫完后面補充。。

四、參考博文

(1) https://www.cnblogs.com/aspirant/p/8630283.html (基本概念等)
(2) https://www.jianshu.com/p/a6b7410a6fbe (部分方法講解)
(3) https://www.jianshu.com/p/948f60a8e64e (nio和io的區別及代碼講解)
(4) https://www.jianshu.com/p/869095b8dc0b (nio教程)
(5) https://www.jianshu.com/p/216bdc25940b (nio)
(6) https://www.jianshu.com/p/f225ab63d58a (java網絡編程io、nio)
(7)https://www.jianshu.com/p/4c8d7b9edec9 (java io和nio的簡單介紹)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM