java的NIO管道用法代碼分享
Java的NIO中的管道,就類似于實(shí)際中的管道,有兩端,一段作為輸入,一段作為輸出。也就是說(shuō),在創(chuàng)建了一個(gè)管道后,既可以對(duì)管道進(jìn)行寫,也可以對(duì)管道進(jìn)行讀,不過(guò)這兩種操作要分別在兩端進(jìn)行。有點(diǎn)類似于隊(duì)列的方式。
這里是Pipe原理的圖示:

創(chuàng)建管道
通過(guò)Pipe.open()方法打開管道。例如:
Pipe pipe = Pipe.open();
向管道寫數(shù)據(jù)
要向管道寫數(shù)據(jù),需要訪問(wèn)sink通道。像這樣:
Pipe.SinkChannel sinkChannel = pipe.sink();
通過(guò)調(diào)用SinkChannel的write()方法,將數(shù)據(jù)寫入SinkChannel,像這樣:
String newData = "New String to write to file..." + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
while(buf.hasRemaining()) {
sinkChannel.write(buf);
}
我們?cè)跍y(cè)試?yán)又薪o出一個(gè)非常簡(jiǎn)單的管道操作,先向管道寫入內(nèi)容,再?gòu)墓艿雷x出內(nèi)容。
package com.test.nio;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;
public class TestPipeA {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//創(chuàng)建一個(gè)管道
Pipe pipe=Pipe.open();
//創(chuàng)建一個(gè)寫管道
Pipe.SinkChannel sinkChannel=pipe.sink();
String newData="itbuluoge.com says:"+System.currentTimeMillis();
ByteBuffer buf=ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
/*向管道寫入內(nèi)容*/
while(buf.hasRemaining())
{
sinkChannel.write(buf);
}
/*創(chuàng)建一個(gè)讀管道*/
Pipe.SourceChannel sourceChannel=pipe.source();
ByteBuffer getBuf=ByteBuffer.allocate(48);
int bytesRead=sourceChannel.read(getBuf);
getBuf.flip();
/*從管道讀出內(nèi)容*/
while(getBuf.hasRemaining())
{
System.out.print((char)getBuf.get());
}
}
}
輸出結(jié)果

我們可以看到,已經(jīng)可以完成我們需要的目標(biāo)了。注意,我在這個(gè)地方編程的時(shí)候,出現(xiàn)了一點(diǎn)錯(cuò)誤,就是我在讀取管道的時(shí)候,沒(méi)有設(shè)置getBuf.flip(),導(dǎo)致無(wú)法讀出數(shù)據(jù),這個(gè)函數(shù)非常重要,在完成buffer讀取內(nèi)容之后,一定要設(shè)置一下讀標(biāo)志,恢復(fù)指針到原始位置,才能讀取到全部?jī)?nèi)容。
以上就是本文關(guān)于java的NIO管道用法代碼分享的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Java中使用RediSearch實(shí)現(xiàn)高效的數(shù)據(jù)檢索功能
RediSearch是一款構(gòu)建在Redis上的搜索引擎,它為Redis數(shù)據(jù)庫(kù)提供了全文搜索、排序、過(guò)濾和聚合等高級(jí)查詢功能,本文將介紹如何在Java應(yīng)用中集成并使用RediSearch,以實(shí)現(xiàn)高效的數(shù)據(jù)檢索功能,感興趣的朋友跟著小編一起來(lái)看看吧2024-05-05
Java實(shí)現(xiàn)ZooKeeper的zNode監(jiān)控
這篇文章主要介紹了Java實(shí)現(xiàn)ZooKeeper的zNode監(jiān)控問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08
IntelliJ?IDEA?2022.1.1?沒(méi)有CVS的過(guò)程分析
這篇文章主要介紹了IntelliJ?IDEA?2022.1.1?沒(méi)有CVS的過(guò)程解析,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
Spring Boot中單例類實(shí)現(xiàn)對(duì)象的注入方式
這篇文章主要介紹了Spring Boot中單例類實(shí)現(xiàn)對(duì)象的注入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
idea2020.1最新版永久破解/pycharm也可用(步驟詳解)
這篇文章主要介紹了idea2020.1最新版永久破解/pycharm也可用,本文給大家分享簡(jiǎn)單實(shí)現(xiàn)步驟,通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
springboot整合swagger3報(bào)Unable to infer base&nbs
這篇文章主要介紹了springboot整合swagger3報(bào)Unable to infer base url錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringBoot和Springfox(Swagger)版本不兼容的解決方案
documentationPluginsBootstrapper這個(gè) bean 無(wú)法正常啟動(dòng),原因是遇到了空指針異常(NullPointerException),這通常是由于 Spring Boot 和 Springfox 的版本不兼容導(dǎo)致的路徑匹配策略沖突,本文給大家介紹了SpringBoot和Springfox(Swagger)版本不兼容的解決方案2024-12-12

