日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BIO 和 NIO

發布時間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BIO 和 NIO 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、阻塞(Block)和非阻塞(NonBlock)

阻塞和非阻塞是進程在訪問數據的時候,數據是否準備就緒的一種處理方式,當數據沒有準備的時候阻塞:

阻塞:往往需要等待缞沖區中的數據準備好過后才處理其他的事情,否則一直等待在那里。

非阻塞:當我們的進程訪問我們的數據緩沖區的時候,如果數據沒有準備好則直接返回,不會等待。如果數據已經準備好,也直接返回

二、BIO與NIO

1、區別

2、Java NIO和IO之間第一個最大的區別是,IO是面向流的而NIO是面向緩沖區的

3、阻塞與非阻塞原因

  (1)Java IO的各種流是阻塞的。這意味著,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再干任何事情了。?

  (2)Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什么都不會獲取。而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。?

4、BIO讀文件方式

?

?5、NIO簡介:核心對象需要掌握:緩沖區(Buffer)、通道(Channel)、選擇器(Selector)。

(1)緩沖區(Buffer)

  緩沖區實際上是一個容器對象,更直接的說,其實就是一個數組,在NIO庫中,所有數據都是用緩沖區處理的。在讀取數據時,它是直接讀到緩沖區中的; 在寫入數據時,它也是寫入到緩沖區中的;任何時候訪問 NIO 中的數據,都是將它放到緩沖區中。

  在NIO中,所有的緩沖區類型都繼承于抽象類Buffer,最常用的就是ByteBuffer

  

  1)其中的四個屬性的含義分別如下:
  容量(Capacity):緩沖區能夠容納的數據元素的最大數量。這一個容量在緩沖區創建時被設定,并且永遠不能改變。
  上界(Limit):緩沖區的第一個不能被讀或寫的元素?;蛘哒f,緩沖區中現存元素的計數。
  位置(Position):下一個要被讀或寫的元素的索引。位置會自動由相應的 get( )和 put( )函數更新。
  標記(Mark):下一個要被讀或寫的元素的索引。位置會自動由相應的 get( )和 put( )函數更新。

  2)Buffer的常見方法如下所示:
  flip(): 寫模式轉換成讀模式
  rewind():將 position 重置為 0 ,一般用于重復讀。
  clear() :清除
  compact(): 將未讀取的數據拷貝到 buffer 的頭部位。
  mark(): reset():mark 可以標記一個位置, reset 可以重置到該位置。
  Buffer 常見類型: ByteBuffer 、 MappedByteBuffer 、 CharBuffer 、 DoubleBuffer 、 FloatBuffer 、 IntBuffer 、 LongBuffer 、 ShortBuffer ?! ?/p>

  3)緩沖區存取數據流程
  存數據時position會++,當停止數據讀取的時候
  調用flip(),此時limit=position,position=0
  讀取數據時position++,一直讀取到limit
  clear() 清空 buffer ,準備再次被寫入 (position 變成 0 , limit 變成 capacity) 。

(2)通道Channel

  1) 通道是一個對象,通過它可以讀取和寫入數據  

  2)使用NIO讀取數據
  在前面我們說過,任何時候讀取數據,都不是直接從通道讀取,而是從通道讀取到緩沖區。所以使用NIO讀取數據可以分為下面三個步驟:

  • 從FileInputStream獲取Channel
  • 創建Buffer
  • 將數據從Channel讀取到Buffer中
  •   3)使用NIO寫入數據
      使用NIO寫入數據與讀取數據的過程類似,同樣數據不是直接寫入通道,而是寫入緩沖區,可以分為下面三個步驟:

  • 從FileOutputStream獲取Channel
  • 創建Buffer
  • 將數據從Channel寫入到Buffer中
  • (3)Selector

      1)在老IO中,serverSocket和socket都是阻塞式的,因此一旦有大規模的并發行為,而每一個訪問都會開啟一個新線程。這時會有大規模的線程上下文切換操作(因為都在等待,所以資源全 都被已有的線程吃掉了),這時無論是等待的線程還是正在處理的線程,響應率都會下降,并且會影響新的線程。

      2)jdk1.4后,引入NIO,工作原理

      

      NIO的工作原理:
      1.由一個專門的線程來處理所有的IO事件,并負責分發。
      2.事件驅動機制:事件到的時候觸發,而不是同步的去監視事件。
      3.線程通訊:線程之間通過wait,notify等方式通訊。保證每次上下文切換都是有意義的。減少無謂的線程切換。

      NlO中實現非阻塞IO的核心設計Selector,Selector就是注冊各種IO事件的地方,而且當那些事件發生時,就是這個對象告訴我們所發生的事件。

      

      當有讀或者寫等任何注冊的事件發生時,可以從Selector中獲得相應的SelectionKey,同時從SelectionKey中可以找到發生的事件和該事件所發生的具體的SelectableChannel,以獲得客戶端發送過來的數據。
      使用NIO中非阻塞IO編寫服務器處理程序,有三個步驟
      1.向Selector對象注冊感興趣的事件
      2.從Selector中獲取感興趣的事件
      3.根據不同事件進行相應的處理

    ?BIO ServerSocket
    ?NIO ServerSocketChannel
    ?AIO AsynchronousServerSocketChannel? :異步非阻塞的IO

    原文連接:https://blog.csdn.net/charjay_lin/article/details/81810922

    轉載于:https://www.cnblogs.com/dongtian-blogs/p/10735027.html

    總結

    以上是生活随笔為你收集整理的BIO 和 NIO的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。