Java的Path、Paths和Files
2020-02-11 16:03:06来源:博客园 阅读 ()
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
包包含与属性相关的类。它将文件属性捆绑在以下六种视图中。BasicFileAttributeView
管理基本文件属性,例如创建时间,上次访问时间,上次修改时间,大小,文件类型(常规文件,目录,符号链接或其他)以及文件密钥(文件的唯一编号)。所有平台均支持此视图。DosFileAttributeView
扩展了BasicFileAttributeView
来访问特定于DOS的文件属性。它提供了检查文件是否为隐藏文件,系统文件,存档文件和只读文件的支持。它仅在支持DOS的系统(例如Microsoft Windows)上可用。POSIX代表UNIX的可移植操作系统接口。
PosixFileAttributeView
扩展了BasicFileAttributeView
并添加了对支持POSIX标准的系统(例如UNIX)上可用的属性的支持。它使我们可以管理所有者,组和[相关访问]权限。FileOwnerAttributeView
管理文件的所有者。ACL代表访问控制列表。
AclFileAttributeView
管理文件的ACL。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
,区别是walk
和newDirectoryStream
是递归的,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
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash