最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中IO和NIO的區(qū)別詳細(xì)解析

 更新時間:2023年11月22日 08:43:04   作者:JackieZhengChina  
這篇文章主要介紹了Java中IO和NIO的區(qū)別詳細(xì)解析,IO和NIO有相同的作用和目的,但實現(xiàn)方式不同,NIO主要用到的是塊,所以NIO的效率要比IO快不少,需要的朋友可以參考下

1.IO和NIO的區(qū)別

NIO就是New IO在JDK1.4中引入。

IO和NIO有相同的作用和目的,但實現(xiàn)方式不同,NIO主要用到的是塊,所以NIO的效率要比IO快不少。

在Java API中提供了兩套NIO,一套針對標(biāo)準(zhǔn)輸入輸出NIO,另一套就是網(wǎng)絡(luò)編程IO。

IONIO
面向流面向緩沖
阻塞IO非阻塞IO
選擇器

面向流和面向緩沖區(qū)

  • Java IO 是面向流的而Java NIO是面向緩沖區(qū)的,就如同一個的重點在于過程,另一重點在于一個有一個階段。

在Java IO中讀取數(shù)據(jù)和寫入數(shù)據(jù)是面向流(Stream)的,就如同河流一樣。所有的數(shù)據(jù)不停地向前的流淌,我們只能觸碰到當(dāng)前的流水。

如果需要獲取某個數(shù)據(jù)的前一項或后一項數(shù)據(jù)那就必須自己緩存數(shù)據(jù)(將水從河流中打出來),而不能直接從流中獲?。ㄒ驗槊嫦蛄骶鸵馕吨覀冎挥幸粋€數(shù)據(jù)流的切面)

  • Java NIO中數(shù)據(jù)的讀寫是面向緩沖區(qū)(Buffer)的,讀取時可以將整塊的數(shù)據(jù)讀取到緩沖區(qū)中,在寫入時則可以將整個緩沖區(qū)中的數(shù)據(jù)一起寫入。

這就好像是在河流上建立水壩,面向流的數(shù)據(jù)讀寫只提供了一個數(shù)據(jù)流切面,而面向緩沖區(qū)的IO則使我們能夠看到所有的水(數(shù)據(jù)的上下文),也就是說在緩沖區(qū)中獲取某項數(shù)據(jù)的前一項數(shù)據(jù)或者是后一項數(shù)據(jù)十分方便。這種便利是有代價的,因為我們必須管理好緩沖區(qū),這包括不能讓新的數(shù)據(jù)覆蓋了緩沖區(qū)中還沒有被處理的有用數(shù)據(jù);將緩沖區(qū)中的數(shù)據(jù)正確的分塊,分清哪些被處理過哪些還沒有等等。

阻塞和非阻塞

  1. Java IO是阻塞的,如果在一次讀寫數(shù)據(jù)調(diào)用時數(shù)據(jù)還沒有準(zhǔn)備好,或者目前不可寫,那么讀寫操作就會被阻塞直到數(shù)據(jù)準(zhǔn)備好或目標(biāo)可寫為止。
  2. Java NIO則是非阻塞的,每一次數(shù)據(jù)讀寫調(diào)用都會立即返回,并將目前可讀(或可寫)的內(nèi)容寫入緩沖區(qū)或者從緩沖區(qū)中輸出,即使當(dāng)前沒有可用數(shù)據(jù),調(diào)用仍然會立即返回并且不對緩沖區(qū)做任何操作。

舉個例子:

IO和NIO去超市買東西,如果超市中沒有需要的商品或者數(shù)量還不夠, IO會一直等到超市中需要的商品數(shù)量足夠了就將所有需要的商品帶回來。Java NIO則不同,不論超市中有多少需要的商品,它都將有需要的商品,立即全部買下并返回,甚至是沒有需要的商品也會立即返回。

IO 要求一次完成任務(wù),NIO允許多次完成任務(wù)

2.IO和NIO的適用場景

NIO是為彌補傳統(tǒng)IO的不足而誕生的,但是NIO也有缺陷,應(yīng)為NIO是面向緩沖區(qū)的操作,每一次的數(shù)據(jù)處理都是對緩沖區(qū)進(jìn)行的,那就必須注意:在數(shù)據(jù)處理之前必須要判斷緩沖區(qū)的數(shù)據(jù)是否完整或者已經(jīng)讀取完畢。如果沒有,假設(shè)數(shù)據(jù)只讀取了一部分,那么對不完整的數(shù)據(jù)處理沒有任何意義。所以每次數(shù)據(jù)處理之前都要檢測緩沖區(qū)。

注意:每次要進(jìn)行數(shù)據(jù)處理必須保證數(shù)據(jù)已經(jīng)準(zhǔn)備完畢,但數(shù)據(jù)處理可以有多次。

IO和NIO各自使用場景:

IO:少量的連接,這些連接每次都要發(fā)送大量的數(shù)據(jù)。

NIO:需要管理同時打開的成千上萬個連接,而這些鏈接每次只發(fā)送少量的數(shù)據(jù),例如聊天服務(wù)器

IO和NIO的工作流程

Java IO 工作流程

由于Java IO是阻塞的,所以當(dāng)面對多個流的讀寫時需要多個線程處理。例如在網(wǎng)絡(luò)IO中,Server端使用一個線程監(jiān)聽一個端口,一旦某個連接被accept,創(chuàng)建新的線程來處理新建立的連接。

在這里插入圖片描述

其中 read/write 是阻塞的。

Java NIO 工作流程

Java NIO 提供 Selector 實現(xiàn)單個線程管理多個channel的功能。

在這里插入圖片描述

其中select 調(diào)用可能是阻塞的,也可以是非阻塞的。但是read/write是非阻塞的!

到此這篇關(guān)于Java中IO和NIO的區(qū)別詳細(xì)解析的文章就介紹到這了,更多相關(guān)IO和NIO的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Seata?環(huán)境搭建部署過程

    Seata?環(huán)境搭建部署過程

    Seata是一個分布式事務(wù),seata服務(wù)端也是一個微服務(wù),需要和其他微服務(wù)一樣需要注冊中心和配置中心,這篇文章主要介紹了Seata?環(huán)境搭建,需要的朋友可以參考下
    2022-10-10
  • Java?設(shè)計模式以虹貓藍(lán)兔的故事講解單例模式

    Java?設(shè)計模式以虹貓藍(lán)兔的故事講解單例模式

    單例模式(Singleton?Pattern)是?Java?中最簡單的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式
    2022-03-03
  • Mybatis-plus通過添加攔截器實現(xiàn)簡單數(shù)據(jù)權(quán)限

    Mybatis-plus通過添加攔截器實現(xiàn)簡單數(shù)據(jù)權(quán)限

    系統(tǒng)需要根據(jù)用戶所屬的公司,來做一下數(shù)據(jù)權(quán)限控制,具體一點,就是通過表中的company_id進(jìn)行權(quán)限控制,項目使用的是mybatis-plus,所以通過添加攔截器的方式,修改查詢sql,實現(xiàn)數(shù)據(jù)權(quán)限,本文就通過代碼給大家詳細(xì)的講解一下,需要的朋友可以參考下
    2023-08-08
  • Spring Cloud Alibaba Nacos Config加載配置詳解流程

    Spring Cloud Alibaba Nacos Config加載配置詳解流

    這篇文章主要介紹了Spring Cloud Alibaba Nacos Config配置中心實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-07-07
  • Spring Bean的定義及三種創(chuàng)建方式

    Spring Bean的定義及三種創(chuàng)建方式

    本文主要介紹了Spring容器獲取Bean的9種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java Socket編程實例(四)- NIO TCP實踐

    Java Socket編程實例(四)- NIO TCP實踐

    這篇文章主要講解Java Socket編程中NIO TCP的實例,希望能給大家做一個參考。
    2016-06-06
  • Java DecimalFormat 保留小數(shù)位及四舍五入的陷阱介紹

    Java DecimalFormat 保留小數(shù)位及四舍五入的陷阱介紹

    這篇文章主要介紹了Java DecimalFormat 保留小數(shù)位及四舍五入的陷阱,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 一名Java高級工程師需要學(xué)什么?

    一名Java高級工程師需要學(xué)什么?

    作為一名Java高級工程師需要學(xué)什么?如何成為一名合格的工程師,這篇文章給了你較為詳細(xì)的答案,需要的朋友可以參考下
    2017-08-08
  • JWT在OpenFeign調(diào)用中進(jìn)行令牌中繼詳解

    JWT在OpenFeign調(diào)用中進(jìn)行令牌中繼詳解

    Feign是一個聲明式的Web Service客戶端,是一種聲明式、模板化的HTTP客戶端。而OpenFeign是Spring Cloud 在Feign的基礎(chǔ)上支持了Spring MVC的注解,如@RequesMapping等等,這篇文章主要給大家介紹了關(guān)于JWT在OpenFeign調(diào)用中進(jìn)行令牌中繼的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Java編程子類能否重寫父類的靜態(tài)方法探索

    Java編程子類能否重寫父類的靜態(tài)方法探索

    關(guān)于子類能否重寫父類的靜態(tài)方法,對像我這種初級的編程愛好者來說仍是值得討論的一件事,下面我們通過具體實例,對此問題進(jìn)行簡單的探索。
    2017-10-10

最新評論

星子县| 司法| 峨边| 大田县| 梁平县| 富顺县| 张家界市| 惠州市| 大田县| 台北县| 资中县| 开鲁县| 醴陵市| 永靖县| 团风县| 清镇市| 裕民县| 凌海市| 丰台区| 肇东市| 中牟县| 安图县| 扶余县| 方山县| 金秀| 广东省| 巴彦县| 克山县| 定日县| 东乌| 隆林| 兖州市| 界首市| 子洲县| 孟津县| 丘北县| 夏邑县| 仪陇县| 乌兰浩特市| 兴山县| 汉中市|