百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Java 17 NIO 知识点 Files 操作(java files.move)

wptr33 2025-03-20 20:07 27 浏览

Java 17 NIO 知识点 Files 操作

对于 Files 类主要是来自模块 java.base 和 包 java.nio。

此类仅包含对文件、目录或其他类型文件进行操作的静态方法。 在大多数情况下,此处定义的方法将委托给关联的文件系统提供者来执行文件操作。

Files

该类是一个常量类,无法被继承,而且没有对应的构造方法。 并且定义了一系列的静态方法,让我们先看看该类的定义。

public final class Files

根据文件的操作类型进行划分,分别为创建文件,删除文件,读取文件,修改文件, 复制文件等一系列的操作方法。这里的文件指的是文件路径,包含文件和目录。

修饰符和类型

方法名

描述

static long

copy(InputStream in, Path target, CopyOption... options)

将输入流中的所有字节复制到文件中。

static long

copy(Path source, OutputStream out)

将文件中的所有字节复制到输出流。

static Path

copy(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 Path

createLink(Path link, Path existing)

为现有文件创建新链接(目录条目)(可选操作)。

static Path

createSymbolicLink(Path link, Path target, FileAttribute... attrs)

创建到目标的符号链接(可选操作)。

static Path

createTempDirectory(String prefix, FileAttribute... attrs)

在默认的临时文件目录中创建一个新目录,使用给定的前缀生成其名称。

static Path

createTempDirectory(Path dir, String prefix, FileAttribute... attrs)

在指定目录中创建一个新目录,使用给定的前缀生成其名称。

static Path

createTempFile(String prefix, String suffix, FileAttribute... attrs)

在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。

static Path

createTempFile(Path dir, String prefix, String suffix, FileAttribute... attrs)

在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。

static void

delete(Path path)

删除文件。

static boolean

deleteIfExists(Path path)

如果文件存在,则删除该文件。

static boolean

exists(Path path, LinkOption... options)

测试文件是否存在。

static Stream

find(Path start, int maxDepth, BiPredicate matcher, FileVisitOption... options)

通过在以给定起始文件为根的文件树中搜索文件,返回一个用 Path 惰性填充的 Stream。

static Object

getAttribute(Path path, String attribute, LinkOption... options)

读取文件属性的值。

static V

getFileAttributeView(Path path, Class type, LinkOption... options)

返回给定类型的文件属性视图。

static FileStore

getFileStore(Path path)

返回表示文件所在文件存储的 FileStore。

static FileTime

getLastModifiedTime(Path path, LinkOption... options)

返回文件的最后修改时间。

static UserPrincipal

getOwner(Path path, LinkOption... options)

返回文件的所有者。

static Set

getPosixFilePermissions(Path path, LinkOption... options)

返回文件的 POSIX 文件权限。

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 Stream

lines(Path path)

从文件中读取所有行作为流。

static Stream

lines(Path path, Charset cs)

用指定的字符,从文件中读取所有行作为流。

static Stream

list(Path dir)

返回一个惰性填充的 Stream,其中的元素是目录中的条目。

static long

mismatch(Path path, Path path2)

查找并返回两个文件内容中第一个不匹配字节的位置,如果没有不匹配,则返回 -1L。

static Path

move(Path source, Path target, CopyOption... options)

将文件移动或重命名为目标文件。

static BufferedReader

newBufferedReader(Path path)

打开一个文件进行读取,返回一个 BufferedReader 以有效地从文件中读取文本。

static BufferedReader

newBufferedReader(Path path, Charset cs)

打开一个文件进行读取,返回一个 BufferedReader 可用于以有效的方式从文件中读取文本。

static BufferedReader

newBufferedWriter(Path path, Charset cs, OpenOption... options)

打开或创建要写入的文件,返回一个 BufferedWriter,可用于以有效的方式将文本写入文件。

static BufferedReader

newBufferedWriter(Path path, OpenOption... options)

打开或创建一个文件进行写入,返回一个 BufferedWriter 以高效的方式将文本写入文件。

static SeekableByteChannel

newByteChannel(Path path, OpenOption... options)

打开或创建文件,返回 用于访问文件的可搜索字节通道。

static SeekableByteChannel

newByteChannel(Path path, Set options, FileAttribute... attrs)

打开或创建一个文件,返回一个可搜索的字节通道来访问该文件。

static DirectoryStream

newDirectoryStream(Path dir)

打开一个目录,返回一个 DirectoryStream 以遍历目录中的所有条目。

static DirectoryStream

newDirectoryStream(Path dir, String glob)

打开一个目录,根据传入的字符串,返回一个 DirectoryStream 以遍历目录中的条目。

static DirectoryStream

newDirectoryStream(Path dir, DirectoryStream.Filter filter)

打开一个目录,返回一个 DirectoryStream 以遍历目录中的条目。

static InputStream

newInputStream(Path path, OpenOption... options)

打开一个文件,返回一个输入流以从文件中读取。

static OutputStream

newOutputStream(Path path, OpenOption... options)

打开或创建文件,返回可用于将字节写入文件的输出流。

static boolean

notExists(Path path, LinkOption... options)

测试此路径所定位的文件是否不存在。

static String

probeContentType(Path path)

探测文件的内容类型。

static byte[]

readAllBytes(Path path)

从文件中读取所有字节。

static List

readAllLines(Path path)

从文件中读取所有行。

static List

readAllLines(Path path, Charset cs)

指定字符集,从文件中读取所有行。

static A

readAttributes(Path path, Class type, LinkOption... options)

作为批量操作读取文件的属性。

static Map

readAttributes(Path path, String attributes, LinkOption... options)

读取一组文件属性作为批量操作。

static String

readString(Path path)

将文件中的所有内容读入字符串,使用 UTF-8 字符集从字节解码为字符。

static String

readString(Path path, Charset cs)

将文件中的所有字符读入字符串,使用指定的字符集从字节解码为字符。

static Path

readSymbolicLink(Path link)

读取符号链接的目标(可选操作)。

static Path

setAttribute(Path path, String attribute, Object value, LinkOption... options)

设置文件属性的值。

static Path

setLastModifiedTime(Path path, FileTime time)

更新文件的最后修改时间属性。

static Path

setOwner(Path path, UserPrincipal owner)

更新文件所有者。

static Path

setPosixFilePermissions(Path path, Set perms)

设置文件的 POSIX 权限。

static long

size(Path path)

返回文件的大小(以字节为单位)。

static Stream

walk(Path start, int maxDepth, FileVisitOption... options)

通过遍历以给定起始文件为根的文件树,返回一个用 Path 惰性填充的 Stream。

static Stream

walk(Path start, FileVisitOption... options)

通过遍历以给定起始文件为根的文件树,返回一个用 Path 惰性填充的 Stream。

static Path

walkFileTree(Path start, FileVisitor visitor)

遍历文件树。

static Path

walkFileTree(Path start, Set options, int maxDepth, FileVisitor visitor)

遍历文件树。

static Path

write(Path path, byte[] bytes, OpenOption... options)

将字节写入文件。

static Path

write(Path path, Iterable lines, Charset cs, OpenOption... options)

将文本行写入文件。

static Path

write(Path path, Iterable lines, OpenOption... options)

将文本行写入文件。

static Path

writeString(Path path, CharSequence csq, Charset cs, OpenOption... options)

将 CharSequence 写入文件。

static Path

writeString(Path path, CharSequence csq, OpenOption... options)

将 CharSequence 写入文件。

创建相关的方法

在说创建类的方法之前, 先看一个接口:FileAttribute

该接口的定义为:

public interface FileAttribute

该接口主要是封装了文件的属性的值,可以在调用对应的 createFile 和 createDirectory 方法,创建新文件或者目录的时候自动设置该值。

他的实现主要在 java.nio.file.attribute 中。 主要是用于提供对文件和文件系统属性的访问的接口和类。

属性视图

描述

AttributeView

可以读取或更新与文件系统中的对象关联的非透明值

FileAttributeView

可以读取或更新文件属性

BasicFileAttributeView

可以读取或更新一组基本的文件属性

PosixFileAttributeView

可以读取或更新 POSIX 定义的文件属性

DosFileAttributeView

可以读取或更新 FAT 文件属性

FileOwnerAttributeView

可以读取或更新文件的所有者

AclFileAttributeView

可以读取或更新访问控制列表

UserDefinedFileAttributeView

可以读取或更新用户定义的文件属性

FileStoreAttributeView

可以读取或更新文件系统属性

createDirectory 和 createDirectorys

注意两者的区别, 如果创建一个目录,很清楚的知道,创建的目录前面的目录是已经存在的, 可以使用 createDirectory 方法创建,如果不能保证文件是否存在,就需要使用 createDirectorys 创建。

如果创建 D:\Code\Java 这个目录, 如果 D:\Code 这个目录不存在使用 createDirectory 就会出现异常。

java.nio.file.NoSuchFileException

该方法的代码演示:

Path pathCreateDirectory = Files.createDirectory(Path.of("E:\\Code\\Java\\Files\\Demo"));
System.out.println(pathCreateDirectory);

Path pathCreateDirectories = Files.createDirectories(Path.of("E:\\Code\\Java\\Files\\Demo\\2022\\01"));
System.out.println(pathCreateDirectories);

createFile 和 exists 以及 notExists

创建一个文件,但是在文件已经存在的时候会创建失败。所以,可以使用 exists 进行判断, 文件是否已经存在了, 如果已经存在就不用在进行创建,多做一次性能的损耗。判断文件存在的方法相反的方法就是判断文件是否不存在 notExists 方法。

需要注意的是 createFile 的方法,也需要创建的文件前的目录必须存在否则会出现无法找到文件的异常,所以, 在实际的工作中,可以先使用 createDirectorys 创建对应的目录,然后再创建文件。

演示代码如下:

String dir = "E:\\Code\\Java\\Files\\Demo\\";
String fileName = "log.txt";

if(Files.notExists(Path.of(dir))){
    System.out.println("创建了目录");
    Files.createDirectories(Path.of(dir));
}
Path pathFile = Path.of(dir, fileName);
if(Files.notExists(pathFile)){
    Path pathCreateFile = Files.createFile(pathFile);
    System.out.println("文件创建: " + pathCreateFile);
}
boolean isCreated = Files.exists(pathFile);
System.out.println("是否已经存在: " + isCreated);

完整代码和运行效果

createLink 和 createSymbolicLink

指定快捷方式的创建, 需要注意的是,对于 createSymbolicLink 方法, 在 Windows 中需要管理员权限,否则会出现 客户端没有所需的特权 的异常。

演示代码如下所示:

String dir = "E:\\Code\\Java\\Files\\Demo\\";
String fileName = "log.txt";
Path pathLink = Files.createLink(Path.of("E:\\Code\\Java\\Files\\Demo\\log.bak.txt"), Path.of(dir, fileName));
System.out.println(pathLink);

Path pathSymbolicLink = Files.createSymbolicLink(Path.of("E:\\Code\\Java\\Files\\Demo\\log.link"),
                                                 Path.of("E:\\Code\\Java\\Files\\Demo\\log.txt"));
System.out.println(pathSymbolicLink);

createTempDirectory 和 createTempFile

代码如下:

Path pathTempDirectory = Files.createTempDirectory("prefix");
System.out.println(pathTempDirectory);
Path pathTempDirectory2 = Files.createTempDirectory(Path.of(""), "prefix");
System.out.println(pathTempDirectory2.toAbsolutePath());

Path pathTempFile = Files.createTempFile("prefix", "suffix");
System.out.println(pathTempFile);

Path pathTempFile2 = Files.createTempFile(Path.of(""), "prefix", "suffix");
System.out.println(pathTempFile2);

创建临时目录和临时文件, 对于 Windows 来说临时目录在:系统盘符/Users/用户名/AppData/Local/Temp 目录。对于临时目录和临时文件,用完以后一定要记得清除, 否则应用程序对应的临时目录会越来越大, 自己造的垃圾要懂得回收。可以使用 File.deleteOnExit() 方法删除。 退出程序之后,删除对应的文件或者目录。

删除的相关方法

delete 和 deleteIfExists

对于该方法, 主要是删除一个目录或者是文件,指定一个 Path 的路径对象。

Files.delete(Path.of("prefix14956008266795807605"));

boolean isDelete = Files.deleteIfExists(Path.of("prefix17311423759899869910"));
System.out.println("如果存在就删除: " + isDelete);

判断的相关方法

直接查看代码:

Path basePath = Path.of("Files07.java");
System.out.println("是否是目录: " + Files.isDirectory(basePath));
System.out.println("文件是否可执行: " + Files.isExecutable(basePath));
System.out.println("是否隐藏: " + Files.isHidden(basePath));
System.out.println("是否可读: " + Files.isReadable(basePath));
System.out.println("是否是普通文件: " + Files.isRegularFile(basePath));
System.out.println("是否文件相同: " + Files.isSameFile(basePath, basePath));
System.out.println("是否是链接: " + Files.isSymbolicLink(basePath));
System.out.println("是否可写: " + Files.isWritable(basePath));

读写的相关方法

readAllLines 和 ReadString

按行读取数据可以使用 readAllLines 相关方法,并且该方法返回了是一个 List 的集合。

List listStr = Files.readAllLines(Path.of("Files07.java"));
System.out.println(listStr.size());

当然也可以指定其字符集。

Files.readAllLines(Path.of("Files07.java"), Charset.forName("UTF-8"));

当然也可以使用直接读取到字符串中,这个方法是重载方法, 和上面一样,除了传入路径还传入了字符集。

完整代码如下:

在读取的基础上一定有写入文件。

Write 和 WriteString

对于写入方法就两个重载方法,对应了一共可用方法 5 个。

常用的 Files 都一一介绍完毕了。 过个眼瘾, 在这个基础上,再迭代自己项目中实战案例。现在就写到这吧。最近项目比较慢,更新内容略慢。希望能把时间安排的更加高效。

对于编程的学习通常是最简单的,对于实际的项目中,业务才是最主要的。写财务软件不懂财务是写不好财务软件的。

感谢阅读,点赞,关注,收藏。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...