- Java NIO Tutorial
- Java NIO - Home
- Java NIO - Overview
- Java NIO - Environment Setup
- Java NIO vs JAVA IO
- Java NIO - Channels
- Java NIO - File Channel
- Java NIO - DataGram Channel
- Java NIO - Socket Channel
- Java NIO - Server Socket Channel
- Java NIO - Scatter
- Java NIO - Gather
- Java NIO - Buffer
- Java NIO - Selector
- Java NIO - Pipe
- Java NIO - Path
- Java NIO - File
- Java NIO - AsynchronousFileChannel
- Java NIO - CharSet
- Java NIO - FileLock
- Java NIO Useful Resources
- Java NIO - Quick Guide
- Java NIO - Useful Resources
- Java NIO - Discussion
Java NIO - 管道
在Java NIO中,管道是一个用于在两个线程之间写入和读取数据的组件。管道主要由两个负责数据传播的通道组成。
两个组成通道中,一个称为Sink通道,主要用于写入数据,另一个称为Source通道,主要用于从Sink通道读取数据。
在数据写入和读取过程中,数据同步保持有序,因为必须确保数据的读取顺序与写入 Pipe 的顺序相同。
需要注意的是,Pipe 中的数据是单向流动的,即数据只能写入 Sink 通道,并且只能从 Source 通道读取。
在Java中,NIO管道被定义为一个抽象类,主要有三个方法,其中两个是抽象的。
Pipe类的方法
open() - 此方法用于获取 Pipe 的实例,或者我们可以说管道是通过调用此方法创建的。
sink() - 此方法返回 Pipe 的接收通道,该通道用于通过调用其 write 方法来写入数据。
source() - 此方法返回 Pipe 的源通道,该通道用于通过调用其 read 方法来读取数据。
例子
下面的例子展示了Java NIO管道的实现。
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;
public class PipeDemo {
public static void main(String[] args) throws IOException {
//An instance of Pipe is created
Pipe pipe = Pipe.open();
// gets the pipe's sink channel
Pipe.SinkChannel skChannel = pipe.sink();
String testData = "Test Data to Check java NIO Channels Pipe.";
ByteBuffer buffer = ByteBuffer.allocate(512);
buffer.clear();
buffer.put(testData.getBytes());
buffer.flip();
//write data into sink channel.
while(buffer.hasRemaining()) {
skChannel.write(buffer);
}
//gets pipe's source channel
Pipe.SourceChannel sourceChannel = pipe.source();
buffer = ByteBuffer.allocate(512);
//write data into console
while(sourceChannel.read(buffer) > 0){
//limit is set to current position and position is set to zero
buffer.flip();
while(buffer.hasRemaining()){
char ch = (char) buffer.get();
System.out.print(ch);
}
//position is set to zero and limit is set to capacity to clear the buffer.
buffer.clear();
}
}
}
输出
Test Data to Check java NIO Channels Pipe.
假设我们有一个文本文件c:/test.txt,其中包含以下内容。该文件将用作我们示例程序的输入。