Java的NIO中的管道,就類似於實際中的管道,有兩端,一段作為輸入,一段作為輸出。也就是說,在創建了一個管道後,既可以對管道進行寫,也可以對管道進行讀,不過這兩種操作要分別在兩端進行。有點類似於隊列的方式。
這裡是Pipe原理的圖示:
創建管道
通過Pipe.open()方法打開管道。例如:
Pipe pipe = Pipe.open();
向管道寫數據
要向管道寫數據,需要訪問sink通道。像這樣:
Pipe.SinkChannel sinkChannel = pipe.sink();
通過調用SinkChannel的write()方法,將數據寫入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);}我們在測試例子中給出一個非常簡單的管道操作,先向管道寫入內容,再從管道讀出內容。
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 {//創建一個管道Pipe pipe=Pipe.open();//創建一個寫管道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();/*向管道寫入內容*/while(buf.hasRemaining()) {sinkChannel.write(buf);}/*創建一個讀管道*/Pipe.SourceChannel sourceChannel=pipe.source();ByteBuffer getBuf=ByteBuffer.allocate(48);int bytesRead=sourceChannel.read(getBuf);getBuf.flip();/*從管道讀出內容*/while(getBuf.hasRemaining()) {System.out.print((char)getBuf.get());}}}輸出結果
我們可以看到,已經可以完成我們需要的目標了。注意,我在這個地方編程的時候,出現了一點錯誤,就是我在讀取管道的時候,沒有設置getBuf.flip(),導致無法讀出數據,這個函數非常重要,在完成buffer讀取內容之後,一定要設置一下讀標誌,恢復指針到原始位置,才能讀取到全部內容。
以上就是本文關於java的NIO管道用法代碼分享的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!