NIO详解及技术(二)
原创我们讨论了上一篇文章。 NIO的基础 还有 三个核心组件 ,本文主要解释NIO其他类(线程之间单向交互数据的管道)。Pipe,以及Path 、Paths 、Files课堂介绍和使用)。
一、管道 (Pipe)
Java NIO 管道是2线程之间的单向数据连接。Pipe有一个source通道和asink频道数据将被写入sink通道,从source通道读取。
我个人的理解是channel用于io变速箱,此处pipe这只是线程间单向数据交互带来的一个小特性。如果有任何错误,请更正通信。
Pipe示意图如下:

示例代码:
public class TestPipe {
@Test
public void test1()throws IOException{
//1.获取管道
Pipe pipe=Pipe.open();
//2.将缓冲区中的数据写入管道。
ByteBuffer buf=ByteBuffer.allocate(1024);
Pipe.SinkChannel sinkChannel=pipe.sink();
buf.put("通过单向管道发送数据".getBytes());
buf.flip();
sinkChannel.write(buf);
//3.读取缓冲区中的数据。
Pipe.SourceChannel sourceChannel=pipe.source();
buf.flip();
int len=sourceChannel.read(buf);
System.out.println(new String(buf.array(),0,len));
sourceChannel.close();
sinkChannel.close();
}
}
二、NIO.2 – Path 、Paths 、Files
基于异步Channel的IO,NIO新增Path接口,Paths工具类,Files工具类。 这些接口和工具类是成对的。NIO中的函数高度封装,大大简化了文件系统的IO编程。
1、Path接口
在java.io及java.nio在中,已完成。File类访问文件系统(使用文件和目录)。File类表示),File类无法利用特定文件系统的特性,因此性能不佳,所以在中。NIO.2中引入了Path接口。
Path该接口表示独立于平台的路径(文件和目录)。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 对象的字符串表示形式。
2、Files工具类
java.nio.file.Files 用于操作文件或目录的工具类。(在过去IO中操作文件的类为。File,但是File类只能操作文件(创建、删除、修改属性等),但不能修改文件的内容。但是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 指定文件的大小
判断方法:
- 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 与指定文件关联的属性。
操作内容的方法:
- SeekableByteChannel 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 对象
应用程序代码,懒得直接写大哥的代码:
package nio;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
//Files工具类通常是组合的。Path对象使用
public class FileTest {
public static void main(String[] args) throws FileNotFoundException, IOException {
//将传统io读取和写入文件后,在中高度封装。NIO.2只需调用复制文件。File工具类的copy()方法
Files.copy(Paths.get("tmp.txt"), new FileOutputStream("tmp2.txt"));
//这是一个隐藏的文件吗
System.out.println("tmp.txt这是一个隐藏的文件吗: "+Files.isHidden(Paths.get("tmp.txt")));
//一次读取所有行 , 您需要指定编码规则。
List lines = Files.readAllLines(Paths.get("tmp.txt"), Charset.forName("gbk"));
System.out.println(lines);
//文件大小
System.out.println("tmp.txt文件大小为: "+Files.size(Paths.get("tmp.txt")));
List poem = new ArrayList<>();
poem.add("海平面跳跃");
poem.add("天空很高,鸟儿在飞。");
//将字符串数组直接写入文件。
Files.write(Paths.get("tmp.txt"), poem, Charset.forName("gbk"));
}
}
输出为:
tmp.txt这是一个隐藏的文件吗: false
[海平面跳跃, 天空很高,鸟儿在飞。]
tmp.txt文件大小为: 24 版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123




