Java NIO 中的 Path 、Files 和 AsychronousFileChannel (附多人聊天室内代码)(上)

简介: Java NIO 中的 Path 、Files 和 AsychronousFileChannel (附多人聊天室内代码)

Path

1、Path 简介


Java Path 接口是 Java NIO 中更新的一部分,同 Java NIO 在一起包括在 Java6 和 Java7 中。Java Path 接口是在 Java7 中添加到 Java NIO 中。 Path 接口位于java.nio.file 包中,所以 Path 接口的完全限定名为 java.nio.file.Path。


Java Path 实例表示文件系统中的路径。一个路径可以指向一个文件或者一个目录。路径可以是绝对路径,也可以是相对路径。绝对路径包含从文件系统的根目录到它指向的文件或者目录的完整路径。相对路径包含相对于其他路径的文件或者目录的路径。


在许多方面 java.nio.Path 接口类食欲 java.io.File 类。但是有一些差别。不过在许多情况下,可以使用 Path 接口来替换 File 类的使用


2、创建 Path 实例


使用 java.nio.file.Path 实例必须创建 一个 Path 实例。 可以使用 Paths 类(java.nio.file.Paths)中的静态方法 Paths.get() 来创建路径实例。


示例代码


Path path = Paths.get("/xxx/01.txt");


上述代码,可以理解为,Paths.get() 方法是一个 Path 实例的工厂方法。


3、创建绝对路径


(1)创建绝对够路径,通过调用 Paths.get() 方法,给绝对路径作为参数来完成:


示例代码:


Path path = Paths.get("C:\01.txt");


上述代码中,绝对路径是 "C:\01.txt" 。 在Java字符串中,\ 是一个转义字符,需要编写 \ , 告诉 Java 编译器在字符串中写入一个 \ 字符。


(2)如果在 Linux 、MacOS 等操作系统上,上面的绝对路径可能如下:


Path path = Paths.get("/home/zsh/filename.txt")


绝对路径地址为 /home/zsh/filename.txt


(3) 如果在 Windows 及其上使用了从 /开始的路径,那么将被解释为相对当前驱动器。


4、创建相对路径


Java NIO Path 类也可以用于处理相对路径。您可以使用 Paths.get(basPath, relativePath) 方法创建一个相对路径。


示例代码:


// 代码1
Path projects = Paths.get("c:\SoruceCode", "aproject");
// 代码2
Path projects = Paths.get("c:\SoruceCode", "aproject\a.txt");


代码 1 创建了一个 Java Path 实例, 指向路径(目录)“c:\SoruceCode\aproject”


代码 2 创建了一个 Path 的实例, 指向路径(文件)“c:\SoruceCode\aproject\a.txt”


5、 Path.normalize()


Path 接口 normalize() 放啊放可以使路径标准化。标准化意味着它将移除所有的路径字符串中的代码 . 和 .. 代码,并且解析路径字符串所引用的路径。


Path.normailze() 例子:


String originalPath = "c:\SoruceCode\..\ss-demo";
Path path1 = Paths.get(originalPath);
System.out.println("path1 = " + path1);
Path path2 = path1.normalize();
System.out.println("path2 = " + path2);


数据结果:标准化的路径不包含 SoruceCode\.. 部分


Files


Java NIO Files 类(java.nio.file.Files) 提供了几种操作文件系统中文件的方法。以下内容介绍 Java NIO Files 常用的一些方法。java.nio.file.Files 类与 java.nio.file.Path 实例一起工作,因此在学习 Files 类之前,需要先了解 Path 类。


1、Files.createDrectory()


Files.createDirectory 方法,用于根据 Path 实例创建一个新目录。


实例:


Path path = Paths.get("/xx/newdir");
try {
    Path newDir = Files.createDirectory(path);
} catch (FileAlreadyExistsException ex) {
    // 目录已经存在
    ex.printStackTrace();
} catch (IOException e) {
    // 其他异常
    e.printStackTrace();
}


第一行表示要创建目录的 Path 实例。 在 try-catch 块中,用路径作为参数调用 Files.createDirectory() 方法。如果创建目录成功,将返回一个 Path 实例,该实例指向新创建的路径。


如果该目录已经存在则抛出一个 java.nio.file.FileAlreadyExistsException 。 如果出现其他的错误可能抛出 IOException。 例如,如果想要创建的新目录的父级目录不窜在,则可能抛出 IOException。


2、Files.copy()


(1)Files.copy() 方法从一个路径拷贝一个文件到另外一个目录


示例:


Path sourcePath = Paths.get("/xxx/newdir/01.txt");
Path destinationPath = Paths.get("/xxx/newdir/01.txt");
try {
    Files.copy(sourcePath, destinationPath);
} catch (FileAlreadyExistsException ex) {
    // 目录已经存在
    ex.printStackTrace();
} catch (IOException e) {
    // 其他异常
    e.printStackTrace();
}


首先,该示例创建了两个 Path 实例。然后这个例子调用 Files.copy() ,将两个 Path 实例作为参数传递。这个让源路径引用的文件被复制到目标路径引用的文件中。


如果目标文件以及经存在。则抛出 java.nio.file.FileAlreadyExistsException 异常。如果有其他错误则抛出一个 IOException 。例如,如果将该文件复制到不存在的目录,则会抛出 IOException。


(2)覆盖已经存在的文件


Files.copy() 方法的第三个参数。如果目标文件已经存在,这个参数指示 copy 方法覆盖现有的文件。


Files.copy(sourcePath, destinationPath, 
           StandardCopyOption.REPLACE_EXISTING);


3、Files.move()


Files.move() 用于文件从一个路径移动到另外一个路径。移动文件与重命名相同。移动文件既可以移动到不同的目录,也可以在相同的操作中更爱它的名称。


示例;


Path sourcePath = Paths.get("/xxx/newdir/01.txt");
Path destinationPath = Paths.get("/xxx/newdir/01.txt");
try {
    //Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
    Files.move(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
} catch (FileAlreadyExistsException ex) {
    // 目录已经存在
    ex.printStackTrace();
} catch (IOException e) {
    // 其他异常
    e.printStackTrace();
}


Files.move() 的第三个参数。这个参数告诉我们 Files.move 方法覆盖目标路径上的现有文件。


4、Files.delete()


Files.delete() 方法可以删除一个文件或者目录


示例:


Path path = Paths.get("/xxx/newdir/01.txt");
try {
    Files.delete(path);
} catch (FileAlreadyExistsException ex) {
    // 目录已经存在
    ex.printStackTrace();
} catch (IOException e) {
    // 其他异常
    e.printStackTrace();
}


创建指向需要删除的文件的 Path 。 然后调用 Files.delete() 方法,如果 Files.delete() 不能删除文件(例如,文件或者目录不存在),会抛出一个 IOException。


5、Files.walkFileTree()


(1)Files.walkFileTree() 方法包含递归遍历目录树功能,将 Path 实例和 FileVisitor 作为参数。Path 实例指向要遍历的目录,FileVisitor 在遍历期间被调用。


(2)FileVisitor 是一个接口,必须自己实现 FilleVisitor 接口,并将实现的实例 床给 walkFileTree() 方法,在目录遍历过程中,您的 FileVisitor 实现的每个方法都将被调用。如果不需要实现所有这些方法,那么可以拓展 SimpleFileVisitor 类,它包含 FileVisitor 接口中所有方法的默认实现。


(3)Filevisitor 接口的一个方法中,每个都返回一个 FileVisitResult 枚举实例。 FileVisitResult 枚举包含以下四个选项:


  • CONTINUE 继续
  • TERMINATE 终止
  • SKIP_SIBING 跳过同级
  • SKIP_SUBTREE 跳过子级


(4) 查找一个名为 001.txt 文件例子


Path rootPath = Paths.get("c:\SourceCode");
String filetoFind = File.separator + "001.txt";
try {
    Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            String fileString = String.valueOf(file.toAbsolutePath());
            if (fileString.endsWith(filetoFind)) {
                System.out.println("file found at path" + file.toAbsolutePath());
                return FileVisitResult.TERMINATE;
            }
            return FileVisitResult.CONTINUE;
        }
    });
} catch (FileAlreadyExistsException ex) {
    // 目录已经存在
    ex.printStackTrace();
} catch (IOException e) {
    // 其他异常
    e.printStackTrace();
}


相关文章
|
13天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
63 2
|
2月前
|
存储 Java API
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
120 2
|
2月前
|
安全 Java API
Java 17新特性让你的代码起飞!
【10月更文挑战第4天】自Java 8发布以来,Java语言经历了多次重大更新,每一次都引入了令人兴奋的新特性,极大地提升了开发效率和代码质量。本文将带你从Java 8一路走到Java 17,探索那些能让你的代码起飞的关键特性。
83 1
|
27天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
37 5
Java反射机制:解锁代码的无限可能
|
23天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
59 3
|
29天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
80 10
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
73 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
24天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
23天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
下一篇
无影云桌面