java的NIO管道用法代碼分享
Java的NIO中的管道,就類似于實際中的管道,有兩端,一段作為輸入,一段作為輸出。也就是說,在創(chuàng)建了一個管道后,既可以對管道進(jìn)行寫,也可以對管道進(jìn)行讀,不過這兩種操作要分別在兩端進(jìn)行。有點類似于隊列的方式。
這里是Pipe原理的圖示:
創(chuàng)建管道
通過Pipe.open()方法打開管道。例如:
Pipe pipe = Pipe.open();
向管道寫數(shù)據(jù)
要向管道寫數(shù)據(jù),需要訪問sink通道。像這樣:
Pipe.SinkChannel sinkChannel = pipe.sink();
通過調(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); }
我們在測試?yán)又薪o出一個非常簡單的管道操作,先向管道寫入內(nèi)容,再從管道讀出內(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)建一個管道 Pipe pipe=Pipe.open(); //創(chuàng)建一個寫管道 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)建一個讀管道*/ 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)了。注意,我在這個地方編程的時候,出現(xiàn)了一點錯誤,就是我在讀取管道的時候,沒有設(shè)置getBuf.flip(),導(dǎo)致無法讀出數(shù)據(jù),這個函數(shù)非常重要,在完成buffer讀取內(nèi)容之后,一定要設(shè)置一下讀標(biāo)志,恢復(fù)指針到原始位置,才能讀取到全部內(nèi)容。
以上就是本文關(guān)于java的NIO管道用法代碼分享的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
springboot大文件上傳、分片上傳、斷點續(xù)傳、秒傳的實現(xiàn)
本文主要介紹了springboot大文件上傳、分片上傳、斷點續(xù)傳、秒傳的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Java?Web實現(xiàn)簡易圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java?Web實現(xiàn)簡易圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-09-09使用shardingsphere對SQLServer坑的解決
本文主要介紹了使用shardingsphere對SQLServer坑的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03淺析Spring boot 中 logback 配置<springPropert
這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02詳解java爬蟲jsoup解析多空格class數(shù)據(jù)
在本篇內(nèi)容中小編給大家分享了java爬蟲jsoup怎么解析多空格class數(shù)據(jù)的方法和技巧,需要的朋友們跟著學(xué)習(xí)下。2018-12-12Spring Cloud動態(tài)配置刷新RefreshScope使用示例詳解
這篇文章主要為大家介紹了Spring Cloud動態(tài)配置刷新RefreshScope使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Java利用SpEL表達(dá)式實現(xiàn)權(quán)限校驗
這篇文章主要為大家詳細(xì)介紹了Java如何利用SpEL表達(dá)式實現(xiàn)權(quán)限校驗功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01Java設(shè)計通用的返回數(shù)據(jù)格式過程講解
現(xiàn)在很多的項目server端返回client端的數(shù)據(jù)多數(shù)以JSON格式返回,同時結(jié)合其它需要,通常加一下狀態(tài)碼和信息之類,給前端處理帶來很大的方便,這篇文章就用Java設(shè)計了通用的返回數(shù)據(jù)格式,感興趣的同學(xué)可以參考下文2023-05-05關(guān)于SpringCloud?Ribbon替換輪詢算法問題
Spring?Cloud?Ribbon是基于Netlix?Ribbon實現(xiàn)的一套客戶端負(fù)載均衡的工具。接下來通過本文給大家介紹SpringCloud?Ribbon替換輪詢算法問題,需要的朋友可以參考下2022-01-01