Paths
创建对象
static Path get(String first, String... more);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的字符串
Tips:在创建文件或目录时,可以指定属性,例如文件的拥有者和权限。但是,指定属性的细节取决于文件系统_
获取文件信息
existsisHiddenisReadable、isWritable、isExecutable- isRegularFile(判断文件是否是一个规范路径的文件)、isDirectory、IsSymbolicLink(判断文件是否是一个符号链接)
size(返回文件的字节数)getOwner()将文件的拥有者将作为一个java.nio.file.attribute.UserPrincipal的一个实例返回
所有的文件系统都会报告一个基本属性集,它们被封装在BasicFileAttributes接口中BasicFileAttributes bsa = Files._readAttributes_(path, BasicFileAttributes.class);
基本文件属性包括:
- 创建文件、最后一次访问以及最后一次修改文件的时间,这些时间都表示成java.nio.file.attribute.FileTime。
- 文件是常规文件、目录还是符号链接,抑或这三者都不是。
- 文件大小。
- 文件主键,这是某种类的对象,具体所属类与文件系统相关,有可能是文件的唯一标识符,也可能不是。
/
如果用户文件系统兼容POSIX,那么你可以获取一个PosixFileAttributes实例
从中找到组拥有者、拥有者、组,以及访问权限。这种信息中很多内容在操作系统之间并不具备可移植性
/PosixFileAttributes pfa = Files.readAttributes(path, PosixFileAttributes.class);
迭代目录中的文件
简介:旧的File类有一个方法,可以用来获取由一个目录中的所有文件构成的数组,但是当目录中包含大量的文件时,这个方法的性能会非常低
//Files类设计了一个方法,它可以产生一个Iterable对象//try语句块用来确保目录流可以被正确关闭。访问目录中的项并没有具体的顺序try (DirectoryStream<Path> paths = Files.newDirectoryStream(path);){for (Path dir : paths){System.out.println(dir);}} catch (IOException e) {e.printStackTrace();}
可以用glob模式来过滤文件:如果使用Windows的glob语法,则必须对反斜杠转义两次:一次为glob语法转义,一次为Java字符串转义
DirectoryStream<Path> paths = Files._newDirectoryStream_(path,"*.java")

<br />
访问某个目录的所有子孙成员
调用**walkFileTree方法**,并向其传递一个FileVisitor类型的对象参数
FileVisitor类需要实现的方法
- 在遇到一个文件或目录时:FileVisitResult visitFile(T path,BasicFileAttributes attrs)
- 在一个目录被处理前:FileVisitResult preVisitDirectory(T dir,IOExceptionex)
- 在一个目录被处理后:FileVisitResult postVisitDirectory(T dir,IOExceptionex)
- 试图访问文件或目录时发生错误,FileVisitResultvisitFileFailed(path,IOException)->没有权限打开目录
对于上述每种情况,都可以指定是否希望执行下面的操作:
- 继续访问下一个文件:
FileVisitResult.CONTINUE - 继续访问,但是不再访问这个目录下的任何项l:
FileVisitResult.SKIP_SUBTREE - 继续访问,但是不再访问这个文件的兄弟文件了:
FileVisitResult.SKIP_SIBLINGS - 终止访问:
FileVisitResult.TERMINATE
当有任何方法抛出异常时,就会终止访问,而这个异常会从**walkFileTree方法**中抛出
注意:FileVisitor接口是泛化类型。walkFileTree方法可以接受**FileVisitor<?Super Path>**类型的参数,但是Path并没有多少超类型。便捷类SimpleFileVisitor实现了FileVisitor接口,但是其除visitFileFailed方法之外的所有方法并不做任何处理而是直接继续访问,而visitFileFailed方法会抛出由失败导致的异常,并进而终止访问。
我们需要覆盖visitFileFailed方法,默认实现是重新抛出异常,访问会在遇到不允许打开的目录时立即失败。
Files.walkFileTree(path, new FileVisitor<Path>() {@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {return FileVisitResult.SKIP_SIBLINGS;}@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {return FileVisitResult.TERMINATE;}@Overridepublic FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {return FileVisitResult.SKIP_SUBTREE;}});
文件系统(Zip)
FileSystem fs = FileSystems._newFileSystem_(Paths.get(zipname));
Map
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);
文件遍历:
FileSystem fs = FileSystems.newFileSystem(path);Files.walkFileTree(fs.getPath("/"),new SimpleFileVisitor(){@Overridepublic FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException {System.out.println(file);return FileVisitResult.CONTINUE;}});
