Path、Paths、Files
Path 接口
1、是 Java NIO 更新的一部分,在 Java 7 中添加到 Java NIO
2、完全限定名称:java.nio.file.Path
3、Java Path 实例表示文件系统中的路径
(1)一个路径可以指向一个文件或一个目录
(2)路径可以是绝对路径,也可以是相对路径
(3)绝对路径包含从文件系统的根目录,到它指向的文件或目录的完整路径
(4)相对路径包含相对于其他路径的文件或目录的路径
4、java.nio.file.Path 接口类似于 java.io.File 类,但是有差别,多数情况下,可以使用 Path 接口来替换 File 类的使用
5、返回一个路径,该路径是冗余名称元素的消除
Path normalize();
(1)该方法的精确定义是依赖于实现的,但通常来说,该方法源自此路径,不包含冗余名称元素的路径
(2)在许多文件系统中,. 和 .. 是用于指示当前目录和父目录的特殊名称,在这样的文件系统中,所有出现的 . 都被认为是冗余的,如果 .. 前面有一个非 .. 的名称,那么这两个名称都被认为是冗余的(识别这些名称的过程被重复,直到它不再适用)
(3)此方法不访问文件系统,该路径可能找不到存在的文件
(4)从路径中删除 .. 和前面的名称可能导致定位与原始路径不同的文件的路径,当前面的名称是符号链接时,可能会出现这种情况
(5)返回不包含冗余的名称元素的 Path,如果此路径具有根组件并且所有名称元素都是冗余的,则返回空路径
Paths
1、工具类,用来获取 Path 实例
3、将路径字符串或从路径字符串连接起来的一系列字符串,转换为 Path
public static Path get(String first, String... more) {
return FileSystems.getDefault().getPath(first, more);
}
(1)如果 more 没有指定任何元素,那么 first 参数的值是要转换的路径字符串
(2)如果 more 指定一个或多个元素,则每个非空字符串(包括 first)被认为是名称元素的序列,并且被连接以形成路径字符串
(3)关于字符串如何连接的细节是提供者指定的,但通常它们将使用 name-separator 作为分隔符进行连接,例如,如果名称分隔符为 /,并调用 getPath("/foo","bar","gus") ,则路径字符串 /foo/bar/gus 将转换为 Path
(4)一个 Path 表示空路径,如果返回 first 是空字符串,more 不包含任何非空字符串
(5)该 Path 通过调用获得 getPath 的方法 default FileSystem
(6)请注意,虽然这种方法非常方便,但使用它将意味着,假设引用默认值 FileSystem 并限制调用代码的实用性,因此,它不应该用于旨在灵活重用的库代码,更灵活的替代方法是使用现有的 Path 实例作为锚点
(7)first:路径字符串或路径字符串的初始部分
(8)more:要连接的附加字符串以形成路径字符串
Files 类
1、该类只包含对文件,目录或其他类型文件进行操作的静态方法
2、在大多数情况下,这里定义的方法将委托给相关的文件系统提供程序来执行文件操作
3、测试文件是否存在
public static boolean exists(Path path, LinkOption... options)
(1)options 参数可用于指示如果文件是符号链接的情况下,如何处理符号链接
(2)默认情况下,遵循符号链接,如果存在选项 NOFOLLOW_LINKS,则不遵循符号链接
(3)请注意,此方法的结果会立刻过时,如果此方法指示文件存在,则不保证子序列访问将成功,在安全敏感应用程序中使用此方法时需要注意
(4)path:要测试文件的路径
(5)options:表示如何处理符号链接的选项
(6)如果文件存在,返回 true;如果文件不存在或其存在无法确定,返回 false
4、创建一个新的目录
public static Path createDirectory(Path dir, FileAttribute<?>... attrs) throws IOException
(1)检查文件是否存在,以及在不存在的情况下,创建目录是一个单一的操作,相对于所有其他可能影响目录的文件系统活动来说是原子性的
(2)attrs 参数是可选的文件属性,用于在创建目录时原子化地设置,每个属性都由它的名字来标识,如果在数组中包含一个以上的同名属性,那么除了最后出现的属性,其他的都会被忽略
(3)dir:要创建的目录
(4)attrs:一个可选的文件属性列表,用于在创建目录时原子化地进行设置
5、创建多级目录
public static Path createDirectories(Path dir, FileAttribute<?>... attrs) throws IOException
(1)与 createDirectory 方法不同,如果无法创建目录,则不会抛出异常,因为它已存在
(2)当创建不存在的目录时,attrs 参数是可选的 file-attributes 以原子方式设置,每个文件属性由其name标识 。 如果数组中包含多个同名的属性,则忽略除最后一个事件之外的所有属性。
(3)如果此方法失败,则可能会创建部分父目录
(4)dir:要创建的目录
(5)attrs:创建目录时以原子方式设置的文件属性的可选列表
6、将文件复制到目标文件
public static Path copy(Path source,
Path target,
CopyOption... options)
throws IOException
(1)此方法使用 options 参数指定如何执行副本将文件复制到目标文件
(2)默认情况下,如果目标文件已经存在或者是符号链接,则副本将失败,除非源和目标是相同文件,否则该方法在没有复制文件的情况下完成
(3)文件属性不需要复制到目标文件
(4)如果支持符号链接,并且文件是符号链接,那么链接的最终目标将被复制
(5)如果文件是目录,那么它将在目标位置创建一个空目录(目录中的条目不被复制)
(6)该方法可以使用 walkFileTree 方法复制目录和目录中的所有条目,或者需要的整个文件树
(7)options 参数可能包括以下任何一项
public enum StandardCopyOption implements CopyOption {
//替换现有文件(如果存在)
REPLACE_EXISTING,
//将属性复制到新文件
COPY_ATTRIBUTES,
//将文件作为原子文件系统操作移动
ATOMIC_MOVE;
}
(8)复制文件不是原子操作
(9)如果抛出一个 IOException ,则目标文件可能不完整,或者某些文件属性尚未从源文件复制
(10)当指定 REPLACE_EXISTING 选项并且目标文件存在时,将替换目标文件
(11)对于其他文件系统活动,检查文件的存在和创建新文件可能不是原子的
(12)source:要复制的文件的路径
(13)target:目标文件的路径(可能与源路径的不同提供程序相关联)
(14)options:指定副本应如何完成的选项
7、将文件移动或重命名为目标文件
public static Path move(Path source,
Path target,
CopyOption... options)
throws IOException
(1)默认情况下,此方法尝试将文件移动到目标文件,如果目标文件存在,则失败,除非源和目标是相同文件,在这种情况下,此方法不起作用
(2)如果文件是符号链接,则移动符号链接本身,而不是链接的目标被移动
(3)可以调用此方法来移动空目录
(4)options 参数可能包括以下任何一项
public enum StandardCopyOption implements CopyOption {
//替换现有文件(如果存在)
REPLACE_EXISTING,
//将属性复制到新文件
COPY_ATTRIBUTES,
//将文件作为原子文件系统操作移动
ATOMIC_MOVE;
}
(5)如果源文件和目标文件存储都支持,移动文件将会将 last-modified-time 复制到目标文件
(6)复制文件时间戳可能导致精度损失
(7)实现也可以尝试复制其他文件属性,但如果文件属性无法复制,则不需要它们失败
(8)当作为非原子操作执行移动,并且抛出 IOException 时,则不会定义文件的状态
(9)原始文件和目标文件都可能存在,目标文件可能不完整,或者某些文件属性可能未被复制到原始文件中
(10)source:要移动的文件的路径
(11)target:目标文件的路径(可能与源路径的不同提供程序相关联)
(12)options:指定移动应该如何完成的选项
8、删除文件
public static void delete(Path path) throws IOException
(1)实现可能需要检查文件以确定文件是否为目录,因此,这种方法对于其他文件系统操作可能不是原子的
(2)如果文件是符号链接,那么符号链接本身而不是链接的最终目标被删除
(3)如果文件是目录,那么该目录必须为空
(4)该方法可以使用 walkFileTree 方法来删除目录和目录中的所有条目,或者需要的整个文件树
(5)在某些操作系统上,当文件打开并被该 JVM 或其他程序使用时,可能无法删除文件
(6)path:要删除的文件的路径
遍历一个文件树
public static Path walkFileTree(Path start,
FileVisitor<? super Path> visitor)
throws IOException
1、等价于 walkFileTree(start, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, visitor),即它不遵循符号链接,并访问文件树的所有级别
2、start:起始文件,要遍历的目录
3、visitor:为每个文件调用的文件访问者
4、返回起始文件
FileVisitor 接口
1、文件访问者
2、该接口的实现被提供给 Files.walkFileTree 方法,来访问文件树中的每个文件
3、在目录遍历过程中,FileVisitor 实现的每个方法都将被调用
4、FileVisitor 接口的方法中,每个都返回一个 FileVisitResult 枚举实例
public enum FileVisitResult {
//继续
CONTINUE,
//终止
TERMINATE,
//继续,不访问此目录中的条目,即跳过子级
SKIP_SUBTREE,
//继续,不访问这个文件或目录的同级文件或目录
SKIP_SIBLINGS;
}
SimpleFileVisitor 类
1、包含 FileVisitor 接口中所有方法的默认实现
2、在目录中的条目被访问之前调用一个目录
public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) throws IOException
(1)除非被覆盖,否则此方法返回 CONTINUE
3、在目录中的条目之后调用目录,并且已经访问了所有的后代
public FileVisitResult postVisitDirectory(T dir, IOException exc) throws IOException
(1)除非被覆盖,这个方法返回 CONTINUE
(2)如果目录迭代没有 I / O 异常,则完成,否则这种方法重新抛出引起该目录的迭代的 I / O 异常,以过早终止
4、为目录中的文件调用
public FileVisitResult visitFile(T file, BasicFileAttributes attrs) throws IOException
(1)除非被覆盖,否则此方法返回 CONTINUE
5、为无法访问的文件调用
public FileVisitResult visitFileFailed(T file, IOException exc) throws IOException
(1)除非被覆盖,否则此方法将重新抛出阻止文件被访问的 I / O 异常
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战