java中的管道 nio_JAVA NIO知识点总结(7)——管道Pipe

管道(Pipe)

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

4811f6bf7ddcbc40bdcc85a4291a42a0.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 readAttributes(Path path,Class 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 对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值