Java的Path、Paths和Files

2020-02-11 16:03:06来源:博客园 阅读 ()

容器云强势上线!快速搭建集群,上万Linux镜像随意使用

Java的Path、Paths和Files

前言

因为这几天被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);
    }

原文链接:https://www.cnblogs.com/ALuShu/p/12295669.html
如有疑问请与原作者联系

标签:em如果ClassAVIEsys

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:【笔记4-商品模块】从0开始 独立完成企业级Java电商网站开发(服

下一篇:《 Java 编程思想》CH02 一切都是对象