java NIO 之 Pipe
Java NIO Pipe是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。
Pipe原理的图示:
Pipe的特点
Pipe 提供一种机制,可以按照写入的顺序读取数据。 Pipe.SinkChannel用来向管道写入数据,而Pipe.SourceChannel用来从管道读取数据
例子:
package cn.outofmemory.nio.channels; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Pipe; public class PipeTest { public static void main(String[] args) throws IOException { //初始化Pipe实例 Pipe pipe = Pipe.open(); // 获取写通道 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(); //向写通道写入数据 while(buffer.hasRemaining()) { skChannel.write(buffer); } //获得读取数据通道 Pipe.SourceChannel sourceChannel = pipe.source(); buffer = ByteBuffer.allocate(512); //将读取数据写到控制台 while(sourceChannel.read(buffer) > 0){ //flip方法将当前读取位置设置为0, limit设置为写入数据的size buffer.flip(); while(buffer.hasRemaining()){ char ch = (char) buffer.get(); System.out.print(ch); } //clear方法将buffer的limit设置为其容量capacity, 将position设置为0 buffer.clear(); } } }
输出:
Test Data to Check java NIO Channels Pipe.
创建管道
Pipe pipe = Pipe.open();
向管道写数据
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); }
从管道读取数据
Pipe.SourceChannel sourceChannel = pipe.source();
调用source通道的read()方法来读取数据:
ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = sourceChannel.read(buf);
read()方法返回的int值会告诉我们多少字节被读进了缓冲区。
相关推荐
Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/...Java NIO系列教程(十一) Pipe Java NIO系列教程(十二) Java NIO与IO
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...
4. **管道(Pipe)**:在某些特定情况下,两个线程之间可以使用`java.nio.Pipe`进行单向数据传递。 5. **文件系统API**:NIO还提供了`java.nio.file`包,包含一系列与文件系统交互的类,如Files、Paths等。 Java ...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在传统的Java IO模型中,读写操作是阻塞的,即当调用read或write方法时,线程会等待数据准备好或...
根据提供的文件信息,我们可以提取并总结出关于Java NIO(New Input/Output)的重要知识点。 ### Java NIO 概述 Java NIO 是 Java 平台的一个重要特性,首次出现在 Java 1.4 版本中。它为 Java 开发者提供了一套...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一个新特性,旨在提供一种比传统的IO(I/O)模型更高效、性能更好的处理输入和输出的方式。传统的Java IO基于流(Stream)...
6. **管道(Pipes)**:在NIO中,Pipe提供了一种单向的数据传输通道,用于在两个线程之间传递数据。 7. **多路复用(Multiplexing)**:通过选择器,NIO可以实现I/O的多路复用,即一个线程可以处理多个连接,显著...
6. **管道(Pipe)**:NIO还支持管道通信,允许两个线程之间直接交换数据,无需经过主内存,提高了数据传输效率。 7. **scatter/gather(分散/聚集)**:NIO允许数据从多个缓冲区分散写入一个通道,或者从一个通道...
- `java.nio.channels.Pipe`:用于创建管道,实现进程间通信。 - `java.nio.channels.AsynchronousSocketChannel` 和 `AsynchronousServerSocketChannel`:提供异步的TCP连接支持。 - `java.nio.file.Paths` 和 `...
**JAVA NIO 异步通信模板服务端** Java NIO(New Input/Output)是Java在J2SE 1.4版本中引入的一个新特性,它提供了与标准I/O完全不同的编程模型,尤其是在处理大量并发连接时,NIO展现出了更高的效率。本模板...
Java NIO(New IO)是Java 1.4版本引入的一个新API,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO基于块I/O,而NIO则基于通道(Channel)和缓冲区(Buffer)进行数据传输。NIO的...
缓冲区是 NIO 的核心组件之一,用于存储数据。Java NIO 提供了多种缓冲区,每种缓冲区对应不同的数据类型: - **ByteBuffer**:用于存储 byte 类型的数据。 - **CharBuffer**:用于存储 char 类型的数据。 - **...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从JDK 1.4版本开始引入的一种新的IO模型,它为Java应用程序提供了更高效的数据传输方式,尤其适用于高并发、大数据量的网络服务。与传统的IO...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。尚硅谷的12讲Java NIO课程,旨在深入浅出地讲解这一重要概念,帮助开发者提升程序的性能和效率。...
此外,NIO还包含了文件通道(FileChannel)、管道(Pipe)、字符集(Charset)等概念。文件通道可以从文件直接读写,而管道则可以实现线程间的通信。字符集处理则解决了在不同编码格式之间转换的问题。 总结来说,...
此外,Java NIO还引入了`Pipe`和`FileChannel`等特性,使得进程间通信和文件操作也变得更加灵活。`Pipe`允许两个线程之间通过管道进行单向数据传输,而`FileChannel`提供了直接内存映射到文件的能力,提高了大文件...
7. **管道(Pipe)**:管道是Java NIO中用于线程间通信的一种机制,它允许两个线程之间通过管道进行单向数据传输。 8. **字符集转换**:Java NIO提供Charset类和CharsetDecoder/CharsetEncoder类,支持多种字符集的...