Java NIO深入理解Pipe(管道)
2018-02-19 12:24
519 查看
一 Java NIO概述
Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。
数据会被写到sink通道,从source通道读取。Pipe原理图:
二 创建管道
通过Pipe.open()方法打开管道。示例:
Pipe pipe = Pipe.open();
三 向管道写数据
要向管道写数据,需要访问sink通道。示例:
Pipe.SinkChannel sinkChannel = pipe.sink();
通过调用SinkChannel的write()方法,将数据写入SinkChannel,示例:
String newData = "测试文件写入数据" + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
while(buf.hasRemaining()) {
sinkChannel.write(buf);
}
四 从管道读取数据
从读取管道的数据,需要访问source通道,示例:
Pipe.SourceChannel sourceChannel = pipe.source();
调用source通道的read()方法来读取数据,示例:
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = sourceChannel.read(buf);
read()方法返回的int值会告诉我们多少字节被读进了缓冲区。
五 完整实例
package com.lanhuigu.nio.channel;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;
public class TestPipe {
public static void main(String[] args) throws IOException {
// 1. 获取管道
Pipe pipe = Pipe.open();
// 2. 将缓冲区数据写入到管道
// 2.1 获取一个通道
Pipe.SinkChannel sinkChannel = pipe.sink();
// 2.2 定义缓冲区
ByteBuffer buffer = ByteBuffer.allocate(48);
buffer.put("发送数据".getBytes());
buffer.flip(); // 切换数据模式
// 2.3 将数据写入到管道
sinkChannel.write(buffer);
// 3. 从管道读取数据
Pipe.SourceChannel sourceChannel = pipe.source();
buffer.flip();
int len = sourceChannel.read(buffer);
System.out.println(new String(buffer.array(),0,len));
// 4. 关闭管道
sinkChannel.close();
sourceChannel.close();
}
}
Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。
数据会被写到sink通道,从source通道读取。Pipe原理图:
二 创建管道
通过Pipe.open()方法打开管道。示例:
Pipe pipe = Pipe.open();
三 向管道写数据
要向管道写数据,需要访问sink通道。示例:
Pipe.SinkChannel sinkChannel = pipe.sink();
通过调用SinkChannel的write()方法,将数据写入SinkChannel,示例:
String newData = "测试文件写入数据" + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
while(buf.hasRemaining()) {
sinkChannel.write(buf);
}
四 从管道读取数据
从读取管道的数据,需要访问source通道,示例:
Pipe.SourceChannel sourceChannel = pipe.source();
调用source通道的read()方法来读取数据,示例:
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = sourceChannel.read(buf);
read()方法返回的int值会告诉我们多少字节被读进了缓冲区。
五 完整实例
package com.lanhuigu.nio.channel;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;
public class TestPipe {
public static void main(String[] args) throws IOException {
// 1. 获取管道
Pipe pipe = Pipe.open();
// 2. 将缓冲区数据写入到管道
// 2.1 获取一个通道
Pipe.SinkChannel sinkChannel = pipe.sink();
// 2.2 定义缓冲区
ByteBuffer buffer = ByteBuffer.allocate(48);
buffer.put("发送数据".getBytes());
buffer.flip(); // 切换数据模式
// 2.3 将数据写入到管道
sinkChannel.write(buffer);
// 3. 从管道读取数据
Pipe.SourceChannel sourceChannel = pipe.source();
buffer.flip();
int len = sourceChannel.read(buffer);
System.out.println(new String(buffer.array(),0,len));
// 4. 关闭管道
sinkChannel.close();
sourceChannel.close();
}
}
相关文章推荐
- Java NIO深入理解Channel(通道)
- 深入理解JAVA中的NIO
- Java-NIO(九):管道 (Pipe)
- 深入理解Java NIO
- java NIO selector全面深入理解
- 深入理解Linux进程间通信(IPC)-- 管道pipe
- JAVA NIO 新IO 分析 理解 深入 实例,如何利用JAVA NIO提升IO性能
- Java NIO深入理解Selector
- Java IO深入理解管道(PipedInputStream、PipedOutputStream、PipedReader、PipedWriter)
- Java NIO -- 管道 (Pipe)
- Java基础知识强化之IO流笔记82:NIO之 Pipe(管道)
- 深入理解Java NIO
- java NIO selector全面深入理解
- Java-NIO(九):管道 (Pipe)
- 深入理解java NIO
- Java NIO深入理解FileChannel
- Java NIO深入理解通道之间数据传输
- 深入理解Java多线程中的wait(),notify()和sleep()
- Java Reflection深入理解构造器(Constructor)
- 深入理解Java虚拟机笔记---垃圾收集算法