Java NIO Files类(java.nio.file.Files)提供了几种方法来处理文件系统中的文件。 这个Java NIO文件教程将涵盖这些方法中最常用的。 Files类包含许多方法,所以如果你需要一个在这里没有描述的方法,那么也检查JavaDoc。 Files类可能还有一个方法。

java.nio.file.Files类与java.nio.file.Path实例一起使用,所以在使用Files类之前,您需要了解Path类。

Files.exists()

Files.exists()方法检查给定的Path是否存在于文件系统中。

可以创建文件系统中不存在的Path实例。 例如,如果您打算创建一个新的目录,您将首先创建相应的Path实例,然后创建该目录。

由于Path实例可能指向或不指向文件系统中存在的路径,因此可以使用Files.exists()方法来确定它们是否执行(以防需要检查)。

这里是一个Java Files.exists()的例子:

Path path = Paths.get("data/logging.properties");boolean pathExists =Files.exists(path,new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});

这个例子首先创建一个Path实例,指向我们要检查的路径是否存在。 其次,该示例使用Path实例调用Files.exists()方法作为第一个参数。

注意Files.exists()方法的第二个参数。 此参数是影响Files.exists()如何确定路径是否存在的选项数组。 在上面的例子中,数组包含LinkOption.NOFOLLOW_LINKS,这意味着Files.exists()方法不应该跟随文件系统中的符号链接来确定路径是否存在。

Files.createDirectory()

Files.createDirectory()方法从Path实例创建一个新目录。 这是一个Java Files.createDirectory()示例:

Path path = Paths.get("data/subdir");try {Path newDir = Files.createDirectory(path);
} catch(FileAlreadyExistsException e){// the directory already exists.
} catch (IOException e) {//something else went wronge.printStackTrace();
}

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

如果该目录已经存在,则会抛出java.nio.file.FileAlreadyExistsException异常。 如果出现其他问题,可能会抛出IOException异常。 例如,如果所需新目录的父目录不存在,则可能会抛出IOException。 父目录是要在其中创建新目录的目录。 因此,它意味着新目录的父目录。

Files.copy()

Files.copy()方法复制一个文件到另一个从一个路径。这是一个Java NIO Files.copy()例子:

Path sourcePath      = Paths.get("data/logging.properties");
Path destinationPath = Paths.get("data/logging-copy.properties");try {Files.copy(sourcePath, destinationPath);
} catch(FileAlreadyExistsException e) {//destination file already exists
} catch (IOException e) {//something else went wronge.printStackTrace();
}

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

如果目标文件已经存在,则抛出java.nio.file.FileAlreadyExistsException异常。 如果出现其他问题,则抛出IOException异常。 例如,如果复制文件的目录不存在,则抛出IOException。

覆盖现有的文件

可以强制Files.copy()覆盖现有的文件。 这里有一个例子展示如何使用Files.copy()覆盖现有的文件:

Path sourcePath      = Paths.get("data/logging.properties");
Path destinationPath = Paths.get("data/logging-copy.properties");try {Files.copy(sourcePath, destinationPath,StandardCopyOption.REPLACE_EXISTING);
} catch(FileAlreadyExistsException e) {//destination file already exists
} catch (IOException e) {//something else went wronge.printStackTrace();
}

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

Files.move()

Java NIO Files类还包含将文件从一个路径移动到另一个路径的功能。 移动文件与重命名文件相同,只是移动文件可以将文件移动到不同的目录并在同一操作中更改其名称。 是的,java.io.File类也可以通过renameTo()方法来实现,但是现在在java.nio.file.Files类中也有文件移动功能。

这是一个Java Files.move()示例:

Path sourcePath      = Paths.get("data/logging-copy.properties");
Path destinationPath = Paths.get("data/subdir/logging-moved.properties");try {Files.move(sourcePath, destinationPath,StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {//moving file failed.e.printStackTrace();
}

首先创建源路径和目标路径。 源路径指向要移动的文件,目标路径指向文件应移至的位置。 然后调用Files.move()方法。 这导致文件被移动。

注意传递给Files.move()的第三个参数。 该参数告诉Files.move()方法覆盖目标路径上的任何现有文件。 这个参数实际上是可选的。

如果移动文件失败,Files.move()方法可能会引发IOException。 例如,如果文件已经存在于目标路径中,并且已经省去了StandardCopyOption.REPLACE_EXISTING选项,或者要移动的文件不存在等。

Files.delete()

Files.delete()方法可以删除文件或目录。 这里是一个Java Files.delete()的例子:

Path path = Paths.get("data/subdir/logging-moved.properties");try {Files.delete(path);
} catch (IOException e) {//deleting file failede.printStackTrace();
}

首先创建指向要删除的文件的路径。 其次调用Files.delete()方法。 如果Files.delete()由于某种原因(例如文件或目录不存在)而无法删除文件,则抛出IOException。

Files.walkFileTree()

Files.walkFileTree()方法包含递归遍历目录树的功能。 walkFileTree()方法将Path实例和FileVisitor作为参数。 Path实例指向您想要遍历的目录。 FileVisitor在转换过程中被调用。

在我解释遍历如何工作之前,首先是FileVisitor接口:

public interface FileVisitor {public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException;public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException;public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException;public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {}

您必须自己实现FileVisitor接口,并将实现的实例传递给walkFileTree()方法。 您的FileVisitor实现的每个方法将在目录遍历期间的不同时间被调用。 如果您不需要挂接所有这些方法,则可以扩展SimpleFileVisitor类,该类包含FileVisitor接口中所有方法的默认实现。

这里是一个walkFileTree()的例子:

Files.walkFileTree(path, new FileVisitor<Path>() {@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {System.out.println("pre visit dir:" + dir);return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {System.out.println("visit file: " + file);return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {System.out.println("visit file failed: " + file);return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {System.out.println("post visit directory: " + dir);return FileVisitResult.CONTINUE;}
});

FileVisitor实现中的每个方法在遍历期间的不同时间被调用:

在访问任何目录之前调用preVisitDirectory()方法。 postVisitDirectory()方法在访问目录之后被调用。

visitFile()方法是在文件遍历期间访问的每个文件被调用的。 它不被称为目录 - 只有文件。 visitFileFailed()方法在访问文件失败的情况下被调用。 例如,如果您没有正确的权限,或其他问题出错。

四个方法中的每一个都返回一个FileVisitResult枚举实例。 FileVisitResult枚举包含以下四个选项:

  • CONTINUE
  • TERMINATE
  • SKIP_SIBLINGS
  • SKIP_SUBTREE
    通过返回这些值之一,被调用的方法可以决定文件的走向应该如何继续。

继续意味着文件散步应该照常继续。

TERMINATE表示文件散步现在应该终止。

SKIP_SIBLINGS表示应该继续执行文件,但不访问此文件或目录的任何兄弟。

SKIP_SUBTREE表示文件行走应继续,但不访问此目录中的条目。 如果从preVisitDirectory()返回,此值只有一个函数。 如果从其他方法返回,它将被解释为CONTINUE。

搜索文件

下面是一个walkFileTree(),它扩展了SimpleFileVisitor以查找一个名为README.txt的文件:

Path rootPath = Paths.get("data");
String fileToFind = File.separator + "README.txt";try {Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {String fileString = file.toAbsolutePath().toString();//System.out.println("pathString = " + fileString);if(fileString.endsWith(fileToFind)){System.out.println("file found at path: " + file.toAbsolutePath());return FileVisitResult.TERMINATE;}return FileVisitResult.CONTINUE;}});
} catch(IOException e){e.printStackTrace();
}
递归删除目录

Files.walkFileTree()也可以用来删除一个包含所有文件和子目录的目录。 Files.delete()方法只会删除一个目录,如果它是空的。 通过遍历所有目录并删除每个目录中的所有文件(在visitFile()内),然后删除目录本身(在postVisitDirectory()内),可以删除包含所有子目录和文件的目录。 这是一个递归目录删除的例子:

Path rootPath = Paths.get("data/to-delete");try {Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {System.out.println("delete file: " + file.toString());Files.delete(file);return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {Files.delete(dir);System.out.println("delete dir: " + dir.toString());return FileVisitResult.CONTINUE;}});
} catch(IOException e){e.printStackTrace();
}

文件类中的其他方法

java.nio.file.Files类包含许多其他有用的功能,比如创建符号链接,确定文件大小,设置文件权限等功能。查看java.nio.file.Files类的JavaDoc以获取更多信息 这些方法。

Java NIO(十六) Files相关推荐

  1. 教妹学Java(二十六):static 关键字解析

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第二十六篇,今天我们来谈谈 Java 的 static 关键字--什么是静态变量?什么是静态方 ...

  2. 教妹学Java(三十六):Java 多态的好处

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第三十六篇,今天我们来谈谈 Java 中的多态--多态有什么好处? 本专栏中的代码已收录到 G ...

  3. Java设计模式(十六):生成器设计模式

    1.应用场景 在软件的设计中,我们可能经常会遇到需要构建某个复杂的对象(比如在游戏开发中,进行人物角色的构建),建造该对象的"过程"是稳定的(对于一个人设来都有身体,脸,发型,手脚 ...

  4. java(十六) 对象的this引用

    2019独角兽企业重金招聘Python工程师标准>>> 1. java提供的this的关键字总是指向调用该方法的对象. 2. 根据this出现位置的不同,this作为默认引用有两种情 ...

  5. java list 在头部添加6_【Java提高十六】集合List接口详解

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  6. 碎片化学习Java(十六)Java for得出年份生肖

    本文参考 嗨客网 Java 实战 Java for循环案例 Java得出是猪年的年份案例 Java for循环 题目 答案 原文 若要查看详细 解题思路.解题步骤.运行结果 原文链接:Java for ...

  7. 更相减损法java,五十六、从高中碾转相除法、更相减损术算法谈起

    「@Author:Runsen」❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」❞ 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾 ...

  8. 海纳百川而来的一篇相当全面的Java NIO教程

    目录 零.NIO包 一.Java NIO Channel通道 Channel的实现(Channel Implementations) Channel的基础示例(Basic Channel Exampl ...

  9. java netty 教程_Java NIO框架Netty教程(十六)

    该图是OneCoder通过阅读Netty源码,逐渐记录下来的.基本可以说明Netty服务的启动流程.这里在具体讲解一下. 首先说明,我们这次顺利的流程是基于NioSocketServer的.也就是基于 ...

最新文章

  1. css超过两行显示为..._这6种组织CSS的方式,可以帮助你解决CSS扩展维护难的问题...
  2. Python图片处理PIL/pillow/生成验证码/出现KeyError: 和The _imagingft C module is not installed...
  3. jmeter constant timer 如何添加_基于jmeter+perfmon的稳定性测试记录
  4. Python助力期末
  5. 认证鉴权与API权限控制在微服务架构中的设计与实现(一)
  6. 在字符串中使用引号()等字符 需要用转义字符\ 例如
  7. 根号x_8.八年级数学:根号(2a1)=12a,怎么求a的取值范围?二次根式
  8. Java教程:Java是什么?Java的特点有哪些?
  9. http-server搭建web服务器
  10. 汽车电子测试系统搭建
  11. VC2012编译protobuf出错处理
  12. matlab找出向量的中位数,MATLAB如何使用median函数计算样本的中位数
  13. 通配符的匹配很全面, 但无法找到元素 ‘aop:aspectj-autoproxy‘ 的声明
  14. nacos注册发现原理
  15. Android Espresso(一)——环境建立
  16. 简单易懂的人工智能系列:关联规则
  17. 南非监管机构严厉打击Facebook的联系人共享
  18. 最新电脑公司最新GHOST WIN7系统32,64位极速安全版
  19. gtx1660是什么级别的_GTX1660显卡首测:1060终于可以退休了!
  20. ipad分屏_Ipad使用技巧大总结。

热门文章

  1. linux php源码安装mysql_linux源码安装mysql5.7
  2. Python内置函数ord()与chr()
  3. 何时适合进行自动化测试?(上)
  4. 软件性能测试——负载测试的最佳实践
  5. linux下 添加一个新账户tom,linux 账户管理命令 useradd、groupadd使用方法
  6. 【收藏】RPM包制作和spec文件详解
  7. python里的class_Python中的Class的讨论
  8. 23.1解析函数的级数表示(二)
  9. 利用深度迁移学习进行基于图像的植物病害识别
  10. 森林病虫害高光谱遥感监测的研究进展