博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA NIO 管道Pipe
阅读量:6119 次
发布时间:2019-06-21

本文共 3554 字,大约阅读时间需要 11 分钟。

  hot3.png

管道(Pipe) 

 Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。

 

215819_Igni_1156339.png

使用方法

(1)创建管道

通过Pipe.open()方法打开管道。

(2)向管道写数据

要向管道写数据,需要访问sink通道。

Pipe.SinkChannel sinkChannel = pipe.sink();

(3)通过调用SinkChannel的write()方法,将数据写入SinkChannel

(4)从管道读取数据

从读取管道的数据,需要访问source通道

Pipe.SourceChannel sourceChannel = pipe.source();

(5)调用source通道的read()方法来读取数据

(本文出自ochina的博主happyBKs的博文:https://my.oschina.net/happyBKs/blog/edit/1604233)

代码示例

下面的代码其实可以分在两个线程内,通过一个管道,在发送数据的源头线程内获取SinkChannel,将数据写入缓冲区,缓冲区切换成读模式,写入SinkChannel;通过该管道在接收数据的线程内获取SourceChannel,然后从SourceChannel读取数据放到缓冲区,然后切换缓冲区为读模式,将数据取出。

本例中为了说明数据是从管道来的,我将缓冲区在写入SinkChannel之后给清空了。最后从SourceChannel中重新获得。

package com.happybks.nio.nio;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.Pipe;import java.nio.channels.Pipe.SinkChannel;import java.nio.channels.Pipe.SourceChannel;import org.junit.Test;public class TestPipe {	@Test	public void test1() throws IOException{		//1、获取管道		Pipe pipe = Pipe.open();				//2、将缓冲区的数据写入管道		ByteBuffer byteBuffer = ByteBuffer.allocate(1024);				SinkChannel sinkChannel = pipe.sink();//Pipe.SinkChannel是Pipe的内部类		byteBuffer.put("通过单向管道发送数据".getBytes());		byteBuffer.flip();		sinkChannel.write(byteBuffer);		byteBuffer.clear();						//3、读取缓冲区中的数据(可以是另一个线程)		SourceChannel sourceChannel = pipe.source();//Pipe.SourceChannel是Pipe的内部类		int len = sourceChannel.read(byteBuffer);		byteBuffer.flip();		System.out.println(new String(byteBuffer.array(),0,len));				sourceChannel.close();		sinkChannel.close();			}}

本文最后,对之前几篇文章中提到的几个类,如Paths等的常用API做个整理,作为本系列最后补充吧。(后面开始整理Netty的知识点。)

 

NIO2中引入的几个实用类

随着 JDK 7 的发布, Java对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为 NIO.2。因为 NIO 提供的一些功能, NIO已经成为文件处理中越来越重要的部分。

Path 与 Paths

java.nio.file.Path 接口代表一个平台无关的平台路径,描述了目录结构中文件的位置。

Paths 提供的 get() 方法用来获取 Path 对象

     Path get(String first, String … more) : 用于将多个字符串串连成路径。

Path 常用方法:

boolean endsWith(String path) : 判断是否以 path 路径结束

boolean startsWith(String path) : 判断是否以 path 路径开始
boolean isAbsolute() : 判断是否是绝对路径
Path getFileName() : 返回与调用 Path 对象关联的文件名
Path getName(int idx) : 返回的指定索引位置 idx 的路径名称
int getNameCount() : 返回Path 根目录后面元素的数量
Path getParent() :返回Path对象包含整个路径,不包含 Path 对象指定的文件路径
Path getRoot() :返回调用 Path 对象的根路径
Path resolve(Path p) :将相对路径解析为绝对路径
Path toAbsolutePath() : 作为绝对路径返回调用 Path 对象
String toString() : 返回调用 Path 对象的字符串表示形式

 

Files 类

java.nio.file.Files 用于操作文件或目录的工具类。

Files常用方法:

Path copy(Path src, Path dest, CopyOption … how) : 文件的复制

Path createDirectory(Path path, FileAttribute<?> … attr) : 创建一个目录
Path createFile(Path path, FileAttribute<?> … arr) : 创建一个文件
void delete(Path path) : 删除一个文件
Path move(Path src, Path dest, CopyOption…how) : 将 src 移动到 dest 位置
long size(Path path) : 返回 path 指定文件的大小

 

Files 类

Files常用方法:用于判断

boolean exists(Path path, LinkOption … opts) : 判断文件是否存在

boolean isDirectory(Path path, LinkOption … opts) : 判断是否是目录
boolean isExecutable(Path path) : 判断是否是可执行文件
boolean isHidden(Path path) : 判断是否是隐藏文件
boolean isReadable(Path path) : 判断文件是否可读
boolean isWritable(Path path) : 判断文件是否可写
boolean notExists(Path path, LinkOption … opts) : 判断文件是否不存在
public static <A extends BasicFileAttributes> A readAttributes(Path path,Class<A> type,LinkOption...options) : 获取与 path 指定的文件相关联的属性。

Files常用方法: 用于操作内容

eekableByteChannel newByteChannel(Path path, OpenOption…how) : 获取与指定文件的连接,how 指定打开方式。

DirectoryStream newDirectoryStream(Path path) : 打开 path 指定的目录
InputStream newInputStream(Path path, OpenOption…how):获取 InputStream 对象
OutputStream newOutputStream(Path path, OpenOption…how) : 获取 OutputStream 对象

转载于:https://my.oschina.net/oosc/blog/1627380

你可能感兴趣的文章
C#如何在DataGridViewCell中自定义脚本编辑器
查看>>
【linux】crontab定时命令
查看>>
Android UI优化——include、merge 、ViewStub
查看>>
Office WORD如何取消开始工作右侧栏
查看>>
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
第一个应用程序HelloWorld
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Android Annotation扫盲笔记
查看>>
React 整洁代码最佳实践
查看>>
聊聊架构设计做些什么来谈如何成为架构师
查看>>
Java并发编程73道面试题及答案
查看>>
移动端架构的几点思考
查看>>
Spark综合使用及用户行为案例区域内热门商品统计分析实战-Spark商业应用实战...
查看>>
初学者自学前端须知
查看>>
Retrofit 源码剖析-深入
查看>>
企业级负载平衡简介(转)
查看>>
ICCV2017 论文浏览记录
查看>>
科技巨头的交通争夺战
查看>>
当中兴安卓手机遇上农行音频通用K宝 -- 卡在“正在通讯”,一直加载中
查看>>