JAVA IO和NIO的主要區(qū)別及使用說(shuō)明
JAVA IO和NIO的主要區(qū)別
IO(BIO)是阻塞的,NIO是非阻塞的
傳統(tǒng)IO在讀寫(xiě)數(shù)據(jù)時(shí)會(huì)阻塞線程,直到數(shù)據(jù)準(zhǔn)備好或完全寫(xiě)入。
例如,InputStream.read()會(huì)一直阻塞,直到有數(shù)據(jù)可讀。NIO通過(guò)通道(Channel)和選擇器(Selector)實(shí)現(xiàn)非阻塞模式,線程可以處理其他任務(wù),無(wú)需等待數(shù)據(jù)就緒。
IO面向流,NIO面向緩沖區(qū)
IO基于流(Stream)模型,數(shù)據(jù)只能單向流動(dòng)(輸入流或輸出流)。NIO基于緩沖區(qū)(Buffer)和通道,數(shù)據(jù)先讀寫(xiě)到緩沖區(qū),再通過(guò)通道雙向傳輸,支持更靈活的數(shù)據(jù)處理。
NIO支持多路復(fù)用
NIO通過(guò)Selector監(jiān)控多個(gè)通道的事件(如連接、讀寫(xiě)),單線程即可管理多個(gè)連接,適合高并發(fā)場(chǎng)景。傳統(tǒng)IO每個(gè)連接需獨(dú)立線程處理,資源消耗大。
核心組件對(duì)比
IO的核心類
InputStream/OutputStream:字節(jié)流基類。Reader/Writer:字符流基類。
NIO的核心類
Buffer:數(shù)據(jù)存儲(chǔ)容器(如ByteBuffer)。Channel:雙向數(shù)據(jù)傳輸通道(如FileChannel、SocketChannel)。Selector:監(jiān)聽(tīng)多個(gè)通道的事件。
性能與應(yīng)用場(chǎng)景
IO適用場(chǎng)景
- 連接數(shù)少、數(shù)據(jù)量大的場(chǎng)景(如文件讀寫(xiě))。
- 代碼簡(jiǎn)單,無(wú)需復(fù)雜并發(fā)控制。
NIO適用場(chǎng)景
- 高并發(fā)、低延遲的網(wǎng)絡(luò)應(yīng)用(如聊天.服務(wù)器)。
- 需要同時(shí)管理大量連接(如Web服務(wù)器)。
代碼示例對(duì)比
傳統(tǒng)IO讀取文件
try (FileInputStream fis = new FileInputStream("file.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
}
NIO讀取文件
try (FileChannel channel = FileChannel.open(Paths.get("file.txt"))) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (channel.read(buffer) != -1) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear();
}
}
總結(jié)
- IO:簡(jiǎn)單易用,適合同步阻塞操作。
- NIO:高性能、非阻塞,適合高并發(fā)網(wǎng)絡(luò)編程。
- 選擇依據(jù):根據(jù)項(xiàng)目需求權(quán)衡開(kāi)發(fā)效率和性能要求。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot使用校驗(yàn)框架validation校驗(yàn)的示例
這篇文章主要介紹了springboot使用校驗(yàn)框架validation校驗(yàn)的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Spring?Boot如何排除自動(dòng)加載數(shù)據(jù)源
這篇文章主要介紹了Spring?Boot如何排除自動(dòng)加載數(shù)據(jù)源,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java異常處理3個(gè)避坑神操作總結(jié)(告別崩潰式報(bào)錯(cuò))
日常Java開(kāi)發(fā)中,有些細(xì)節(jié)看似微小,卻能大幅影響代碼質(zhì)量,這篇文章主要介紹了Java異常處理3個(gè)避坑神操作總結(jié)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-04-04
Springboot上傳文件的同時(shí)傳遞參數(shù)用對(duì)象接收的問(wèn)題及解決方案
在Spring Boot中,若接口需同時(shí)接收文件和其他參數(shù),應(yīng)將文件用@RequestParam標(biāo)注,其他參數(shù)封裝對(duì)象并用@Validated校驗(yàn),避免參數(shù)綁定沖突,本文給大家介紹Springboot上傳文件的同時(shí)傳遞參數(shù)用對(duì)象接收,感興趣的朋友跟隨小編一起看看吧2025-09-09
關(guān)于RabbitMQ的Channel默認(rèn)線程
這篇文章主要介紹了關(guān)于RabbitMQ的Channel默認(rèn)線程,通過(guò)jvm工具觀察rabbitmq的線程使用情況,發(fā)現(xiàn)生產(chǎn)者每發(fā)一條消息,消費(fèi)者這邊就會(huì)創(chuàng)建一條線程,言下之意,一個(gè)channel當(dāng)消息來(lái)到時(shí)就會(huì)異步處理這些消息,需要的朋友可以參考下2023-09-09

