欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

IONIO
面向流面向緩沖
阻塞IO非阻塞IO
無(wú)選擇器

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

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

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

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

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

這就好像是在河流上建立水壩,面向流的數(shù)據(jù)讀寫只提供了一個(gè)數(shù)據(jù)流切面,而面向緩沖區(qū)的IO則使我們能夠看到所有的水(數(shù)據(jù)的上下文),也就是說(shuō)在緩沖區(qū)中獲取某項(xiàng)數(shù)據(jù)的前一項(xiàng)數(shù)據(jù)或者是后一項(xiàng)數(shù)據(jù)十分方便。這種便利是有代價(jià)的,因?yàn)槲覀儽仨毠芾砗镁彌_區(qū),這包括不能讓新的數(shù)據(jù)覆蓋了緩沖區(qū)中還沒(méi)有被處理的有用數(shù)據(jù);將緩沖區(qū)中的數(shù)據(jù)正確的分塊,分清哪些被處理過(guò)哪些還沒(méi)有等等。

阻塞和非阻塞

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

舉個(gè)例子:

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

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

2.IO和NIO的適用場(chǎng)景

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

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

IO和NIO各自使用場(chǎng)景:

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

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

IO和NIO的工作流程

Java IO 工作流程

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

在這里插入圖片描述

其中 read/write 是阻塞的。

Java NIO 工作流程

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

在這里插入圖片描述

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

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

相關(guān)文章

  • Java求解二叉樹的最近公共祖先實(shí)例代碼

    Java求解二叉樹的最近公共祖先實(shí)例代碼

    樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合,這篇文章主要給大家介紹了關(guān)于Java求解二叉樹的最近公共祖先的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 在java中獲取List集合中最大的日期時(shí)間操作

    在java中獲取List集合中最大的日期時(shí)間操作

    這篇文章主要介紹了在java中獲取List集合中最大的日期時(shí)間操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • java mybatis框架配置詳解

    java mybatis框架配置詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java mybatis框架配置詳解內(nèi)容,對(duì)此有興趣的朋友們可以參考下。
    2021-02-02
  • flyway實(shí)現(xiàn)java 自動(dòng)升級(jí)SQL腳本的問(wèn)題及解決方法

    flyway實(shí)現(xiàn)java 自動(dòng)升級(jí)SQL腳本的問(wèn)題及解決方法

    大家在平時(shí)開發(fā)自己寫SQL語(yǔ)句忘記在所有環(huán)境執(zhí)行,需要新增環(huán)境做數(shù)據(jù)遷移,那么遇到這樣的問(wèn)題該如何解決呢?本文通過(guò)場(chǎng)景分析給大家介紹java 自動(dòng)升級(jí)SQL腳本的策略,感興趣的朋友一起看看吧
    2021-07-07
  • Spring中的@ControllerAdvice三種用法詳解

    Spring中的@ControllerAdvice三種用法詳解

    這篇文章主要介紹了Spring中的@ControllerAdvice三種用法詳解,加了@ControllerAdvice的類為那些聲明了(@ExceptionHandler、@InitBinder或@ModelAttribute注解修飾的)方法的類而提供的<BR>專業(yè)化的@Component,以供多個(gè)Controller類所共享,需要的朋友可以參考下
    2024-01-01
  • Java連接并操作Sedna XML數(shù)據(jù)庫(kù)的方法

    Java連接并操作Sedna XML數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了Java連接并操作Sedna XML數(shù)據(jù)庫(kù)的方法,較為詳細(xì)的說(shuō)明了Sedna XML數(shù)據(jù)庫(kù)的原理與功能,并給出了基于java操作Sedna XML數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下
    2015-06-06
  • Mybatis基于注解實(shí)現(xiàn)多表查詢功能

    Mybatis基于注解實(shí)現(xiàn)多表查詢功能

    這篇文章主要介紹了Mybatis基于注解實(shí)現(xiàn)多表查詢功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Spring Boot 將yyyy-MM-dd格式的文本字符串直接轉(zhuǎn)換為L(zhǎng)ocalDateTime出現(xiàn)的問(wèn)題

    Spring Boot 將yyyy-MM-dd格式的文本字符串直接轉(zhuǎn)換為L(zhǎng)ocalDateTime出現(xiàn)的問(wèn)題

    這篇文章主要介紹了Spring Boot 將yyyy-MM-dd格式的文本字符串直接轉(zhuǎn)換為L(zhǎng)ocalDateTime出現(xiàn)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java interface的兩個(gè)經(jīng)典用法

    java interface的兩個(gè)經(jīng)典用法

    這篇文章主要為大家詳細(xì)介紹了java interface的兩個(gè)經(jīng)典用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 微服務(wù)mybatis?typehandler使用詳解(就這一篇夠了)

    微服務(wù)mybatis?typehandler使用詳解(就這一篇夠了)

    TypeHandler是MyBatis框架的核心組件,實(shí)現(xiàn)數(shù)據(jù)庫(kù)表字段類型和Java?數(shù)據(jù)類型之間的相互轉(zhuǎn)換,本文介紹通過(guò)實(shí)例代碼mybatis?typehandler使用,感興趣的朋友一起看看吧
    2024-02-02

最新評(píng)論