Paths

创建对象

  1. static Path get(String first, String... more);
  2. static Path get(URI uri);

方法

Path p.resolve(q)Path p.resolve(String str)

  • 如果q是绝对路径,则结果就是q。
  • 否则,根据文件系统的规则,将“p后面跟着q”作为结果

Path p.resolveSibling(q)Path p.resolveSibling(String str)

  • 它通过解析指定路径的父路径产生其兄弟路径

_resolve_的对立面是_relativize_
Path demo = p1.relativize(p2);—->P1 To P2

  • p1路径到p2路径怎么走的路径

Path p.normalize();

  • 方法将移除所有冗余部分
  • 所有出现的“.”都被认为是冗余的,并且如果“..”的前面带有非“..”名称,则这两个名称都被认为是冗余的

static File toFile()>><<static Path toPath()


Files

输入输出

byte[] bytes = Files._readAllBytes_(path);

  • 以二进制数组读取文件的所有内容

String s = new String(bytes, Charset._defaultCharset_());

  • 以字符串读入

List<String> strings = Files._readAllLines_(path);

  • 将文件当作行序列读入

Files._write_(path, s.getBytes());

  • 写入一个字符串

Files._write_(path, s.getBytes(), StandardOpenOption._APPEND_);

  • 文末追加内容

如果要处理的文件长度比较大,或者是二进制文件,那么还是应该使用所熟知的流或者读入器/写出器
Files._newInputStream_(path);<br />Files._newOutputStream_(path);``<br />Files._newBufferedReader_(path, Charset._defaultCharset_());<br />Files._newBufferedWriter_(path,Charset._defaultCharset_());

复制、移动和删除文件

Files._copy_(path,Topath);

  • 复制文件

Files._move_(path, Topath);

  • 移动(复制并删除源文件)

注意:如果目标路径已经存在,那么复制或移动将失败
/
如果想要覆盖已有的目标路径,可以使用REPLACE_EXISTING选项。
如果想要复制所有的文件属性,可以使用COPY_ATTRIBUTES选项
/
Files._copy_(path, Topath, **StandardCopyOption.**_**REPLACE_EXISTING**_,
**StandardCopyOption.**_**COPY_ATTRIBUTES**_);
/
将移动操作定义为原子性的,这样就可以保证要么移动操作成功完成,要么源文件继续保持在原来位置
使用ATOMIC_MOVE选项来实现
/
Files._copy_(path, Topath, **StandardCopyOption.**_**ATOMIC_MOVE**_);

Files._delete_(path);

  • 删除文件(如果要删除的文件不存在,将抛出异常)
  • Files._deleteIfExists_(path);—->建议使用此方法

创建文件和目录

Files._createDirectories_(path);(会创建路径中所有的中间目录。)
Files._createFile_(path);(如果文件已经存在,将抛出异常)

创建临时文件:_dir是一个Path对象,prefix和suffix是可以为null的字符串
image.png
Tips:在创建文件或目录时,可以指定属性,例如文件的拥有者和权限。但是,指
定属性的细节取决于文件系统_

获取文件信息

  1. exists
  2. isHidden
  3. isReadableisWritableisExecutable
  4. isRegularFile(判断文件是否是一个规范路径的文件)、isDirectory、IsSymbolicLink(判断文件是否是一个符号链接)
  5. size(返回文件的字节数)
  6. getOwner() 将文件的拥有者将作为一个java.nio.file.attribute.UserPrincipal的一个实例返回

所有的文件系统都会报告一个基本属性集,它们被封装在BasicFileAttributes接口中
BasicFileAttributes bsa = Files._readAttributes_(path, BasicFileAttributes.class);

基本文件属性包括:

  1. 创建文件、最后一次访问以及最后一次修改文件的时间,这些时间都表示成java.nio.file.attribute.FileTime。
  2. 文件是常规文件、目录还是符号链接,抑或这三者都不是。
  3. 文件大小。
  4. 文件主键,这是某种类的对象,具体所属类与文件系统相关,有可能是文件的唯一标识符,也可能不是。

/
如果用户文件系统兼容POSIX,那么你可以获取一个PosixFileAttributes实例
从中找到组拥有者、拥有者、组,以及访问权限。这种信息中很多内容在操作系统之间并不具备可移植性
/
PosixFileAttributes pfa = Files.readAttributes(path, PosixFileAttributes.class);

迭代目录中的文件

简介:旧的File类有一个方法,可以用来获取由一个目录中的所有文件构成的数组,但是当目录中包含大量的文件时,这个方法的性能会非常低

  1. //Files类设计了一个方法,它可以产生一个Iterable对象
  2. //try语句块用来确保目录流可以被正确关闭。访问目录中的项并没有具体的顺序
  3. try (DirectoryStream<Path> paths = Files.newDirectoryStream(path);){
  4. for (Path dir : paths){
  5. System.out.println(dir);
  6. }
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }

可以用glob模式来过滤文件:如果使用Windows的glob语法,则必须对反斜杠转义两次:一次为glob语法转义,一次为Java字符串转义

  • DirectoryStream<Path> paths = Files._newDirectoryStream_(path,"*.java")

image.png

<br />

访问某个目录的所有子孙成员
调用**walkFileTree方法**,并向其传递一个FileVisitor类型的对象参数

FileVisitor类需要实现的方法

  1. 在遇到一个文件或目录时:FileVisitResult visitFile(T path,BasicFileAttributes attrs)
  2. 在一个目录被处理前:FileVisitResult preVisitDirectory(T dir,IOExceptionex)
  3. 在一个目录被处理后:FileVisitResult postVisitDirectory(T dir,IOExceptionex)
  4. 试图访问文件或目录时发生错误,FileVisitResultvisitFileFailed(path,IOException)->没有权限打开目录

对于上述每种情况,都可以指定是否希望执行下面的操作:

  1. 继续访问下一个文件:FileVisitResult.CONTINUE
  2. 继续访问,但是不再访问这个目录下的任何项l:FileVisitResult.SKIP_SUBTREE
  3. 继续访问,但是不再访问这个文件的兄弟文件了:FileVisitResult.SKIP_SIBLINGS
  4. 终止访问:FileVisitResult.TERMINATE

当有任何方法抛出异常时,就会终止访问,而这个异常会从**walkFileTree方法**中抛出

注意:FileVisitor接口是泛化类型。
walkFileTree方法可以接受**FileVisitor<?Super Path>**类型的参数,但是Path并没有多少超类型。便捷类SimpleFileVisitor实现了FileVisitor接口,但是其除visitFileFailed方法之外的所有方法并不做任何处理而是直接继续访问,而visitFileFailed方法会抛出由失败导致的异常,并进而终止访问。
我们需要覆盖visitFileFailed方法,默认实现是重新抛出异常,访问会在遇到不允许打开的目录时立即失败。

  1. Files.walkFileTree(path, new FileVisitor<Path>() {
  2. @Override
  3. public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
  4. return FileVisitResult.SKIP_SIBLINGS;
  5. }
  6. @Override
  7. public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
  8. return FileVisitResult.CONTINUE;
  9. }
  10. @Override
  11. public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
  12. return FileVisitResult.TERMINATE;
  13. }
  14. @Override
  15. public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
  16. return FileVisitResult.SKIP_SUBTREE;
  17. }
  18. });

文件系统(Zip)

FileSystem fs = FileSystems._newFileSystem_(Paths.get(zipname));

Map env = new HashMap();
env.put(“capacity”, “16G”);
env.put(“blockSize”, “4k”);
FileSystem fs = FileSystems._newFileSystem_(path, env);

  • env - 用于配置文件系统的提供程序特定属性的映射; 可能是空的

newFileSystem(Path, ClassLoader)

  • 第二个参数指定类加载器

如果知道文件名,那么从ZIP文档中复制出这个文件就会变得很容易:
Files.copy(fs.getPath(suorceName),toPath);

文件遍历:

  1. FileSystem fs = FileSystems.newFileSystem(path);
  2. Files.walkFileTree(fs.getPath("/"),new SimpleFileVisitor(){
  3. @Override
  4. public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException {
  5. System.out.println(file);
  6. return FileVisitResult.CONTINUE;
  7. }
  8. });