`
Donald_Draper
  • 浏览: 984390 次
社区版块
存档分类
最新评论

NIO-Pipe示例

    博客分类:
  • NIO
nio 
阅读更多
PipeImpl解析:http://donald-draper.iteye.com/blog/2373628
前面看了SocketServerChannel,SocketChannel和DatagramChannel,从今天开始我们来看管道,先从一个实例开始:

//主程序(管道)
package nio.pipe;

import java.io.IOException;
import java.nio.channels.Pipe;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * PipeDemo
 * @author donald
 * 2017年4月13日
 * 上午9:27:12
 */
public class PipeDemo {
	public static void main(String[] args) {
		// 创建一个管道
		Pipe pipe = null;
		try {
			pipe = Pipe.open();
		} catch (IOException e) {
			e.printStackTrace();
		}
		ExecutorService exec = Executors.newFixedThreadPool(2);
		exec.submit(new PipeSink(pipe.sink()));
		exec.submit(new PipeSource(pipe.source()));
	}
}

//Sink通道
package nio.pipe;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;

/**
 * SinkChannel
 * @author donald
 * 2017年4月13日
 * 上午9:26:49
 */
public class PipeSink implements Runnable {
	private Pipe.SinkChannel sinkChannel;
	
	public PipeSink(Pipe.SinkChannel sinkChannel) {
		this.sinkChannel = sinkChannel;
	}

	/**
	 * 
	 */
	@Override
	public void run() {
		System.out.println("=========The sink is start!===========");
		try {
			sinkChannel.write(ByteBuffer.wrap(new String("Hello source!").getBytes("UTF-8")));
			System.out.println("send message to source is done...");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


//Source通道
package nio.pipe;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Iterator;

/**
 * SourceChannel
 * @author donald
 * 2017年4月13日
 * 上午8:56:17
 */
public class PipeSource implements Runnable {
	private Selector selector;
	private  Pipe.SourceChannel sourceChannel;

	public PipeSource(Pipe.SourceChannel sourceChannel) {
		this.sourceChannel = sourceChannel;
		try {
			init();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	private void init() throws IOException{
		sourceChannel.configureBlocking(false);
		this.selector = Selector.open();
		sourceChannel.register(selector, SelectionKey.OP_READ);
	}
	@SuppressWarnings("rawtypes")
	@Override
	public void run() {
		System.out.println("=========The source is start!===========");
		try{
			while(true){
				selector.select();
				Iterator ite =  this.selector.selectedKeys().iterator();
				while(ite.hasNext()){
					SelectionKey key = (SelectionKey)ite.next();
					ite.remove();
					if (key.isReadable()) read(key);
				}
			}
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 
	 * @param key
	 * @throws IOException
	 */
	private void read(SelectionKey key) throws IOException{
		Pipe.SourceChannel channel = (Pipe.SourceChannel) key.channel();
		ByteBuffer buf = ByteBuffer.allocate(100);
		channel.read(buf);
		byte[] data = buf.array();
		String msg = new String(data,"UTF-8").trim();
		System.out.println("message come from sink:"+msg);
	}
}

启动主程序管道,控制台输出:
=========The sink is start!===========
send message to source is done...
=========The source is start!===========
message come from sink:Hello source!
0
2
分享到:
评论

相关推荐

    java网络编程NIO视频教程

    Java NIO-Pipe-介绍和代码示例 - **主要内容**:介绍Pipe(管道)的概念及其使用方法,并提供示例代码。 - **学习目标**:学会使用Pipe进行线程间通信。 #### 28. Java NIO-FileLock-介绍和使用方法 - **主要内容*...

    java nio示例代码

    这些示例通常会包含简单的读写文件、服务器端与客户端的通信以及多路复用的使用,帮助初学者快速理解NIO的工作原理和实际应用。在学习过程中,你可以逐步深入,从基础的Buffer操作到复杂的Selector机制,掌握Java ...

    nio-demo:NIO编辑演示

    本项目"nio-demo"是针对NIO编程的一个演示,通过一系列示例代码,帮助我们理解和实践NIO的基本用法。** 1. **文件读写与文件拷贝:** 在NIO中,`java.nio`包提供了`FileChannel`类,它允许我们高效地在文件之间...

    JAVA-NIO程序设计完整实例

    - **Pipe.SinkChannel** 和 **Pipe.SourceChannel**: 提供进程间的单向数据流。 ### 3. NIO操作流程 1. **创建通道**: 根据需求创建FileChannel、SocketChannel或ServerSocketChannel等。 2. **创建缓冲区**: ...

    一个NIO开发的示例代码

    这个名为"nioSamples"的压缩包文件很可能包含了以上概念的Java代码示例,你可以通过学习和运行这些示例,更深入地理解Java NIO的工作原理和使用方法。对于Java初学者来说,这是一个极好的实践资源,可以帮助你快速...

    java nio基础使用示例

    Java NIO(New IO)是Java 1.4版本引入的一种新的I/O API,它提供了非阻塞的I/O操作,极大地提高了I/O操作的效率。...此外,NIO还有Buffer、Pipe、FileChannel等重要概念,它们共同构建了Java NIO的强大功能。

    一个java NIO的例子

    这个"NioServer"示例可能包括以下步骤: - 创建ServerSocketChannel并绑定到指定的端口。 - 注册ServerSocketChannel到选择器,监听新的连接请求(ACCEPT事件)。 - 在主循环中,使用Selector.select()方法检查已...

    Java.NIO资源下载资源下载

    - **管道 (Pipes)**:讨论了 Pipe Channel 的应用场景及其优势。 - **Channels 工具类**:介绍了 Java NIO 提供的一些工具类,用于简化 Channel 的使用。 #### 3. Selector(选择器) - **Selector 基础**:介绍了...

    《NIO与Socket编程技术指南》_高洪岩

    8. 实战案例:提供实际的NIO和Socket编程示例,帮助读者将理论知识应用于实践。 通过阅读《NIO与Socket编程技术指南》,读者不仅可以理解NIO和Socket的基本原理,还能学习到如何在实际项目中有效地利用这些技术,...

    nio.rar_Different_NIO_java nio package

    在给定的"nio.rar_Different_NIO_java nio package"压缩包中,可能包含14个不同的NIO使用示例,涵盖了上述知识点的不同方面。这些例子可以帮助开发者深入理解NIO的工作原理,掌握如何在实际项目中应用NIO技术,提高...

    NIO.rar_NIO_java nio

    Java NIO,全称为Non-Blocking ..."NIO修正版書面例子"这个压缩包文件很可能是包含了一些示例代码,可以帮助你更深入地理解和实践Java NIO的各种特性。通过结合这些示例和Java API文档,你将能够更好地掌握NIO的使用。

    JAVA NIO 异步通信模板服务端

    总结,这个“JAVA NIO 异步通信模板服务端”示例是学习和理解Java NIO机制的好起点,它展示了如何利用NIO的非阻塞特性构建高并发的服务。在实际开发中,结合Android环境,可以进一步优化网络通信和数据交换的效率。

    Java NIO.pdf

    - **实例应用**:提供了一个面向对象的文件搜索工具示例。 #### 七、字符集(Character Sets) - **基础知识**:介绍了字符集的基本概念及其在 Java 中的应用。 - **字符集类**:讲解了 `Charset` 类及其相关方法,...

    IO及NIO技术专题培训材料

    - **Pipe**:用于创建单向数据流。 2.4. **实例讲解** - 基于NIO的服务器端编程,通常会创建ServerSocketChannel监听客户端连接,然后使用Selector监控多个客户端连接,从而实现高效的并发处理。 在学习IO和NIO...

    mldn nio ppt 源码

    5. **Pipe和Scattering/Gathering I/O**:Pipe用于在应用程序内部创建数据管道,Scattering/Gathering I/O允许数据从多个Buffer分散写入或从一个Channel聚集读取,提高数据处理效率。 通过对mldn nio ppt源码的学习...

    java nio 多种模式 源码 支持高并发

    在"nioSamples"这个压缩包中,可能包含了各种NIO场景的示例代码,可以作为学习和调试NIO的参考。 通过学习和实践这些源码,我们可以了解如何创建和管理通道,如何使用缓冲区读写数据,如何注册和使用选择器,以及...

    Java NIO 细节也精彩

    ### Java NIO 的精彩细节解析 #### 一、Selector的Wakeup原理 ##### 1.1 背景介绍 在Java NIO (Non-blocking I/O)中,`Selector` 是核心组件之一,用于监控多个`Channel`上的I/O事件(如可读、可写等)。`...

    IO、文件、NIO 最佳阅读资料与实践

    6. **管道(Pipe)**:在NIO中,Pipe提供了一种进程间通信的方式,允许数据在一个线程写入,另一个线程读取。 7. **字符集**:在处理文本时,必须考虑字符编码。Java支持多种字符集,如ASCII、UTF-8和GBK等。 8. *...

    Java NIO详解(学习资料)

    4. **管道(Pipe)**:管道用于在两个线程间单向传输数据,主要用于线程间的通信。 在Java NIO中,服务器端的工作流程通常如下: 1. 创建一个服务器通道,如`ServerSocketChannel`,监听特定端口。 2. 注册选择器...

    linux下C和java通过管道通信

    在Java中,我们使用`java.nio.Pipe`来创建管道,并通过`java.nio.channels.Pipe.SinkChannel`和`java.nio.channels.Pipe.SourceChannel`进行读写操作。以下是一个简单的Java示例: ```java import java.io....

Global site tag (gtag.js) - Google Analytics