NIO详解及技术(二)

原创
小哥 3年前 (2022-11-09) 阅读数 10 #大杂烩

我们讨论了上一篇文章。 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
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除