前言

因为这几天被java.nio的这几个接口和工具类卡到了,就顺便地查了一波文档以及使用方法,这篇其实更像是API的复制粘贴,只不过我在注释里多写了一些output和注意事项,看不惯API的可以选择不看,下面贴一下常用的,文档资料的主要来源

java2s:http://www.java2s.com/Tutorials/Java/java.nio.file/Files/index.htm

极客教程:https://geek-docs.com/java/java-tutorial/java-tutorials-index.html

java.nio

文件属性

  • java.nio.attribute包包含与属性相关的类。它将文件属性捆绑在以下六种视图中。

    1. BasicFileAttributeView管理基本文件属性,例如创建时间,上次访问时间,上次修改时间,大小,文件类型(常规文件,目录,符号链接或其他)以及文件密钥(文件的唯一编号)。所有平台均支持此视图。

    2. DosFileAttributeView扩展了BasicFileAttributeView来访问特定于DOS的文件属性。它提供了检查文件是否为隐藏文件,系统文件,存档文件和只读文件的支持。它仅在支持DOS的系统(例如Microsoft Windows)上可用。

    3. POSIX代表UNIX的可移植操作系统接口。PosixFileAttributeView扩展了BasicFileAttributeView并添加了对支持POSIX标准的系统(例如UNIX)上可用的属性的支持。它使我们可以管理所有者,组和[相关访问]权限。

    4. FileOwnerAttributeView管理文件的所有者。

    5. ACL代表访问控制列表。AclFileAttributeView管理文件的ACL。

    6. UserDefinedFileAttributeView管理文件的一组用户定义的属性。属性的名称是字符串。属性的值可以是任何数据类型。

  • FileStore类中的supportsFileAttributeView()方法用于判断该系统是否支持以上的视图

  • 然后就是获取这些视图的方法主要就是Files类里的getAttribute(...)readAttributes(...)了,当然setAttribute(...)就肯定使用来设置文件属性的啦

Paths

先介绍一下工具类Paths,因为就两个方法用来生成Path对象,以供Path和Files使用;而Path也经常由Paths来生成,又或者File类有一个toPath();方法可以使用

static Path get(String first, String... more)
//将路径字符串或连接到路径字符串的字符串序列转换为 Path,可以get("c:/abc");或者get("c:","abc"),注意这里可以有多个参数String... more代表n个参数,这个比较常用
static Path get(URI uri)
//将给定的URI转换为Path对象

## Path

接着是Path接口,用来替换File的新接口,虽然名字是 路径 ,但其实也可以是文件

  • 先是构造方式

    Path toPath()
    //File类对象方法--返回一个java.nio.file.Path对象
    abstract Path getPath(String first, String... more)
    //FileSystem对象方法--将路径字符串或从路径字符串连接起来的一系列字符串转换为 Path 。
    /* 然后就是上面的Paths工具类啦,应该还有我不知道的一些姿势,大家自行探索 */
  • 然后是常用方法,会发现Path接口没什么判断方法,其实更多的判断和操作都在Files工具类里面

    boolean isAbsolute()
    //告诉这条路是否是绝对的
    boolean endsWith(Path other)
    //测试此路径是否以给定的路径结束
    boolean endsWith(String other)
    //测试此路径是否以给定字符串结束,如"c:/a/banana/cat"可以以"/banana/cat"结尾,但不能以"t"结尾
    boolean startsWith(Path other)
    //测试此路径是否以给定的路径开始。
    boolean startsWith(String other)
    //测试此路径是否以给定字符串开始,跟上面一样规律 Path getFileName()
    //将此路径表示的文件或目录的名称返回为 Path对象,文件名或文件夹名,不含路径
    Path getName(int index)
    //返回此路径的名称元素作为 Path对象。目录中最靠近root的为0,最远的为(count-1),count由下面的方法获得
    int getNameCount()
    //返回路径中的名称元素的数量。0则只有root
    Path getParent()
    //返回 父路径,如果此路径没有父返回null,如/a/b/c返回/a/b,配合下面的方法消除"."或".."
    Path normalize()
    //返回一个路径,该路径是冗余名称元素的消除。如消除掉"."、".."
    Path getRoot()
    //返回此路径的根组分作为 Path对象,或 null如果该路径不具有根组件。如返回"c:/"
    Path relativize(Path other)
    //构造此路径和给定路径之间的相对路径。有点难理解,p1-"Topic.txt",p2-"Demo.txt",p3-"/Java/JavaFX/Topic.txt",p4-"/Java/2011";;那么p1和p2的结果是"../Demo.txt";;p2和p1的结果是"../Topic.txt";;p3和p4的结果是"../../2011";;p4和p3的结果是"../JavaFX/Topic.txt"
    Path resolve(String other)
    //将给定的路径字符串转换为 Path。如"c:/a/b"和字符串"c.txt"的结果是"c:/a/b/c.txt";更像是拼接
    Path resolveSibling(String other)
    //将给定的路径字符串转换为 Path。如"c:/a/b.txt"和字符串"c.txt"的结果是"c:/a/c.txt";更像是替换
    Path subpath(int beginIndex, int endIndex)
    //返回一个相对的 Path ,它是该路径的名称元素的子序列,如"d:/a/b/c.txt"参数为(1,3)返回一个"b/c.txt"
    Path toAbsolutePath()
    //返回表示此路径的绝对路径的 Path对象。包括盘符和文件名或文件夹名 Iterator<Path> iterator()
    //返回此路径的名称元素的迭代器。"c:/a/b/c.txt"的迭代器可以next出以下"a""b""c.txt"
    File toFile()
    //返回表示此路径的File对象

## Files

最后就是神奇的Files工具类,主要和Path接口的对象进行配合使用

  • 工具类该有的一大堆静态方法,先是判断的:

    static boolean exists(Path path, LinkOption... options)
    //测试文件是否存在。
    static boolean notExists(Path path, LinkOption... options)
    //测试此路径所在的文件是否不存在。
    static boolean isDirectory(Path path, LinkOption... options)
    //测试文件是否是目录。
    static boolean isExecutable(Path path)
    //测试文件是否可执行。
    static boolean isHidden(Path path)
    //告知文件是否被 隐藏 。
    static boolean isReadable(Path path)
    //测试文件是否可读。
    static boolean isRegularFile(Path path, LinkOption... options)
    //测试文件是否是具有不透明内容的常规文件。说实话,我也不太懂常规文件指的是啥
    static boolean isSameFile(Path path, Path path2)
    //测试两个路径是否找到相同的文件。
    static boolean isSymbolicLink(Path path)
    //测试文件是否是符号链接。//
    static boolean isWritable(Path path)
    //测试文件是否可写。
  • 删除的:

    static boolean deleteIfExists(Path path)
    //删除文件(如果存在)。
    static void delete(Path path)
    //删除文件。
  • 复制的:

    static long copy(InputStream in, Path target, CopyOption... options)
    //将输入流中的所有字节复制到文件。关于CopyOption则是一个被继承的接口主要有枚举类StandardCopyOption和LinkOption,前者分别有REPLACE_EXISTING(也就是替换覆盖),COPY_ATTRIBUTES(将源文件的文件属性信息复制到目标文件中)和ATOMIC_MOVE(原子性的复制)都是字面意思,后者只有NOFOLLOW_LINKS也是字面意思,嗯后面这个没看懂(
    static long copy(Path source, OutputStream out)
    //将文件中的所有字节复制到输出流。
    static Path copy(Path source, Path target, CopyOption... options)
    //将文件复制到目标文件。
  • 移动和重命名的:

    static Path move(Path source, Path target, CopyOption... options)
    //将文件移动或重命名为目标文件。
  • 创建文件和文件夹的:

    static Path createDirectories(Path dir, FileAttribute<?>... attrs)
    //首先创建所有不存在的父目录来创建目录。
    static Path createDirectory(Path dir, FileAttribute<?>... attrs)
    //创建一个新的目录。
    static Path createFile(Path path, FileAttribute<?>... attrs)
    //创建一个新的和空的文件,如果该文件已存在失败。
  • 文件属性的:

    static <V extends FileAttributeView> V getFileAttributeView(Path path, 类<V> type, LinkOption... options)
    //返回给定类型的文件属性视图。指定六个视图其中一种,上面一开始有点到。拿到的xxxAttributeView会有一个跟下面一样名字的readAttributes方法来得到一个xxxAttributes真正的获取操作就全是在这个xxxAttributes类的对象里get啦
    static <A extends BasicFileAttributes> A readAttributes(Path path, 类<A> type, LinkOption... options)
    //读取文件的属性作为批量操作。指定一个xxxAttributes,得到一个实例,通过里面的方法得到时间等基本属性 static Object getAttribute(Path path, String attribute, LinkOption... options)
    //读取文件属性的值。这个 String attributes 参数的语法固定是以 view-name:comma-separated-attributes 的形式;view-name指定视图名如basic,posix,acl等,不写默认为basic;有写默认要加":";可以用"basic:*"或"*"读取所有,又或者用"basic:size,lastModifiedTime"读取大小和修改时间。具体还有那些属性可以看具体指定的类,比如basic视图就看BasicFileAttributes这个接口都有哪些方法,可以读取哪些文件属性。同理,下面的 String attributes 一样是这个理
    static Map<String,Object> readAttributes(Path path, String attributes, LinkOption... options)
    //读取一组文件属性作为批量操作。
    static Path setAttribute(Path path, String attribute, Object value, LinkOption... options)
    //设置文件属性的值。 /* 下面这些也是获取属性的方法,不过还没研究到是怎么用的 */
    static FileTime getLastModifiedTime(Path path, LinkOption... options)
    //返回文件的上次修改时间。
    static UserPrincipal getOwner(Path path, LinkOption... options)
    //返回文件的所有者。
    static Set<PosixFilePermission> getPosixFilePermissions(Path path, LinkOption... options)
    //返回文件的POSIX文件权限。
    static Path setLastModifiedTime(Path path, FileTime time)
    //更新文件上次修改的时间属性。
    static Path setOwner(Path path, UserPrincipal owner)
    //更新文件所有者。
    static Path setPosixFilePermissions(Path path, Set<PosixFilePermission> perms)
    //设置文件的POSIX权限。
    static long size(Path path)
    //返回文件的大小(以字节为单位)。
  • 遍历文件列表的(newDirectoryStream只是遍历当前Path的子目录列表,或者写一个方法里面递归调用实现遍历到底;;walk则是可以通过maxDepth参数来决定遍历的深度,后面的FileVisitOption参数可有可无;;list类似于newDirectoryStream,区别是walknewDirectoryStream是递归的,list是非递归的)

    static DirectoryStream<Path> newDirectoryStream(Path dir)
    //打开一个目录,返回一个DirectoryStream以遍历目录中的所有条目。最好用 try-with-resources 构造,可以自动关闭资源。返回的 DirectoryStream<Path> 其实可以直接使用 Iterator或者for循环 遍历每一个 dir 下面的文件或目录
    static DirectoryStream<Path> newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter)
    //上面方法的重载,通过实现参数二(有一个 boolean accept(Path p) 方法来判断文件是否符合需要)来达到过滤的目的。如accept方法中写"return (Files.size(p) > 8192L);"来匹配大于8k的文件
    static DirectoryStream<Path> newDirectoryStream(Path dir, String glob)
    //上面方法的重载,可以通过参数二作为过滤匹配出对应的文件。如 newDirectoryStream(dir, "*.java") 用于遍历目录里所有java后缀的文件 static Stream<Path> walk(Path start, FileVisitOption... options)
    //深度优先遍历。返回一个 Stream ,它通过 Path根据给定的起始文件的文件树懒惰地填充 Path 。
    static Stream<Path> walk(Path start, int maxDepth, FileVisitOption... options)
    //深度优先遍历。返回一个 Stream ,它是通过走根据给定的起始文件的文件树懒惰地填充 Path 。 static Stream<Path> list(Path dir)
    //返回一个懒惰的填充 Stream ,其元素是 Stream中的条目。返回的 Stream 里封装了一个 DirectoryStream 用于遍历。
  • 读取、编辑文件内容的

    static BufferedReader newBufferedReader(Path path)
    //打开一个文件进行阅读,返回一个 BufferedReader以高效的方式从文件读取文本。
    static BufferedReader newBufferedReader(Path path, Charset cs)
    //打开一个文件进行阅读,返回一个 BufferedReader ,可以用来以有效的方式从文件读取文本。
    static BufferedWriter newBufferedWriter(Path path, Charset cs, OpenOption... options)
    //打开或创建一个写入文件,返回一个 BufferedWriter ,可以用来以有效的方式将文本写入文件。
    static BufferedWriter newBufferedWriter(Path path, OpenOption... options)
    //打开或创建一个写入文件,返回一个 BufferedWriter以高效的方式写入文件。
    static SeekableByteChannel newByteChannel(Path path, OpenOption... options)
    //打开或创建文件,返回可访问的字节通道以访问该文件。
    static SeekableByteChannel newByteChannel(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs)
    //打开或创建文件,返回可访问的字节通道以访问该文件。
    static InputStream newInputStream(Path path, OpenOption... options)
    //打开一个文件,返回输入流以从文件中读取。
    static OutputStream newOutputStream(Path path, OpenOption... options)
    //打开或创建文件,返回可用于向文件写入字节的输出流。
    static byte[] readAllBytes(Path path)
    //读取文件中的所有字节。
    static List<String> readAllLines(Path path)
    //从文件中读取所有行。
    static List<String> readAllLines(Path path, Charset cs)
    //从文件中读取所有行。
    static Path write(Path path, byte[] bytes, OpenOption... options)
    //将字节写入文件。
    static Path write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options)
    //将文本行写入文件。
    static Path write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options)
    //将文本行写入文件。

FileSystem

常由FileSystems工具类的getDefault()来生成默认的实例,然后配合FileStore做一些判断,目前还不知道有啥用

## FileStore

文件存储池,主要的几个方法用来检测文件系统——FileSystem是否支持一些操作,还有获取FileSystem的一些属性

  • 可以通过FileSystem的getFileStores()进行获取

  • 一些常用的接口方法

    abstract boolean supportsFileAttributeView(类<? extends FileAttributeView> type)
    //告诉这个文件存储是否支持由给定文件属性视图标识的文件属性。
    abstract boolean supportsFileAttributeView(String name)
    //告诉这个文件存储是否支持由给定文件属性视图标识的文件属性。

## FileTime
表示文件时间戳属性的值,你们可能会在设置文件最后更新属性时碰到这个,顺便提一下使用方法

  • 一些API的方法,这里只放几个可能用得到的方法,更多的可以看官方文档

    static FileTime fromMillis(long value)
    //返回一个 FileTime以 FileTime单位表示给定值。
    long toMillis()
    //返回以毫秒为单位的值。
    String toString()
    //返回此 FileTime的字符串表示 FileTime 。
  • 使用方法

    /**
    * 可能你要从文件属性中的FileTime或者到一个Date对象
    */
    Path pathObj = Paths.get("C:/a/b/c.txt");
    BasicFileAttributes attrs = Files.readAttributes(pathObj, BasicFileAttributes.class);
    Data date = new Date(attrs.lastModifiedTime().toMillis()); /**
    * 又或者可能你要人为地修改这个文件时间属性,需要一个FileTime
    */
    Path path = Paths.get("C:/a/b/c.txt");
    long time = System.currentTimeMillis();
    FileTime fileTime = FileTime.fromMillis(time);
    try{
    Files.setAttribute(path, "basic:lastModifiedTime", fileTime,LinkOption.NOFOLLOW_LINKS);
    }catch (IOException e) {
    System.err.println(e);
    }

Java的Path、Paths和Files的更多相关文章

  1. Java NIO Path接口和Files类配合操作文件

    Java NIO Path接口和Files类配合操作文件 @author ixenos Path接口 1.Path表示的是一个目录名序列,其后还可以跟着一个文件名,路径中第一个部件是根部件时就是绝对路 ...

  2. The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jdk1.8.0_60\bin;C:\Windows\Sun\Jav

    启动项目自动结束,查看日志发现 [ost-startStop-1] o.a.catalina.core.AprLifecycleListener   : The APR based Apache To ...

  3. J2SE 8的输入输出--Path/Paths File/Files; FileSystems 类的用法

    Path的简单用法 //1. Path 正常用法 Path path = Paths.get("src/main/resource/zip"); logger.debug(path ...

  4. Path;Paths和Files;FileVisitor

    package filet; import java.io.FileOutputStream; import java.nio.file.FileStore; import java.nio.file ...

  5. Java NIO学习(Path接口、Paths和Files工具类的使用)

    NIO学习:Paths和Files工具类的使用 JDK1.7引入了新的IO操作类.在java.nio.file包下,Java NIO Path接口和Files类. Path接口:Path表示的是一个目 ...

  6. 关于Tomcat启动时报The APR based Apache Tomcat Native library which allows optimal performanc e in production environments was not found on the java.library.path

    错误信息如下 八月 01, 2016 10:11:15 上午 org.apache.catalina.core.AprLifecycleListener initINFO: The APR based ...

  7. 信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:

    问题信息详细: 信息: The APR based Apache Tomcat Native library which allows optimal performance in productio ...

  8. Tomcat启动慢原因之二 he APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path

    Tomcat启动时提示: 信息: The APR based Apache Tomcat Native library which allows optimal performance in prod ...

  9. JAVA基础知识之NIO.2——Path,Paths,Files

    NIO.2 JDK7对NIO进行了重大改进,主要包含以下两方面 新增Path接口,Paths工具类,Files工具类. 这些接口和工具类对NIO中的功能进行了高度封装,大大简化了文件系统的IO编程. ...

  10. JAVA NIO学习四:Path&Paths&Files 学习

    今天我们将学习NIO 的最后一章,前面大部分涉及IO 和 NIO 的知识都已经讲过了,那么本章将要讲解的是关于Path 以及Paths 和 Files 相关的知识点,以对前面知识点的补充,好了言归正传 ...

随机推荐

  1. Linux下Libevent安装和简单实用

    前言 Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相 ...

  2. 部署Discuz和wordoress

    安装discuz 直接把安装包拷贝到根目录下 然后在浏览器中输入http://localhost/myweb/install/index.php 打开安装向导界面,需要修改一下myweb的权限 安全属 ...

  3. EF中的实体关系

    导航属性的理解: 指数据库的表所对应的实体类,除了要有每个字段所对应的属性之外,还应该有一个与之有关联的表的属性,一对一的关系就是关联表的类型,一对多的关系就是关联表的类型的ICollection的泛 ...

  4. PP: Composite visual mapping for time series visualization

    However: The conventional visual mapping maps each data attribute onto a single visual channel Purpo ...

  5. C++-对象指针的滥用

    C++ 中经常出现使用对象指针,而不是直接使用对象本身的代码,比如下面这个例子: Object *myObject = new Object; 而不是使用: myObject.testFunc(); ...

  6. python3练习100题——009

    今天的题目好像有点水... 原题链接:http://www.runoob.com/python/python-exercise-example9.html 题目:暂停一秒输出. 我的代码: impor ...

  7. [转] UML中的六大关系

    UML中的六大关系 转自:https://www.cnblogs.com/hoojo/p/uml_design.html 在UML类图中,常见的有以下几种关系: 泛化(Generalization), ...

  8. js面向对象的程序设计 --- 上篇(理解对象)

    前言 ECMAScript中没有类的概念,因此它们的对象与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序的集合属性,其属性可以包含基本值,对象或者函数".正因 ...

  9. RS-232C

    RS-232C标准(协议)的全称是EIA-RS-232C标准,定义是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准".它是在1970年由美国电子 ...

  10. php设计模式之工厂方法实例代码

    实现不修改原代码,扩展新功能 <?php header("Content-type:text/html;charset=utf-8"); /** * db接口 * 实现连接数 ...