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

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

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

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

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

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

相关推荐

每天一个编程技巧!掌握这7个神技,代码效率飙升200%

“同事6点下班,你却为改BUG加班到凌晨?不是你不努力,而是没掌握‘偷懒’的艺术!本文揭秘谷歌工程师私藏的7个编程神技,每天1分钟,让你的代码从‘能用’变‘逆天’。文末附《Python高效代码模板》,...

Git重置到某个历史节点(Sourcetree工具)

前言Sourcetree回滚提交和重置当前分支到此次提交的区别?回滚提交是指将改动的代码提交到本地仓库,但未推送到远端仓库的时候。...

git工作区、暂存区、本地仓库、远程仓库的区别和联系

很多程序员天天写代码,提交代码,拉取代码,对git操作非常熟练,但是对git的原理并不甚了解,借助豆包AI,写个文章总结一下。Git的四个核心区域(工作区、暂存区、本地仓库、远程仓库)是版本控制的核...

解锁人生新剧本的密钥:学会让往事退场

开篇:敦煌莫高窟的千年启示在莫高窟321窟的《降魔变》壁画前,讲解员指着斑驳色彩说:"画师刻意保留了历代修补痕迹,因为真正的传承不是定格,而是流动。"就像我们的人生剧本,精彩章节永远...

Reset local repository branch to be just like remote repository HEAD

技术背景在使用Git进行版本控制时,有时会遇到本地分支与远程分支不一致的情况。可能是因为误操作、多人协作时远程分支被更新等原因。这时就需要将本地分支重置为与远程分支的...

Git恢复至之前版本(git恢复到pull之前的版本)

让程序回到提交前的样子:两种解决方法:回退(reset)、反做(revert)方法一:gitreset...

如何将文件重置或回退到特定版本(怎么让文件回到初始状态)

技术背景在使用Git进行版本控制时,经常会遇到需要将文件回退到特定版本的情况。可能是因为当前版本出现了错误,或者想要恢复到之前某个稳定的版本。Git提供了多种方式来实现这一需求。...

git如何正确回滚代码(git命令回滚代码)

方法一,删除远程分支再提交①首先两步保证当前工作区是干净的,并且和远程分支代码一致$gitcocurrentBranch$gitpullorigincurrentBranch$gi...

[git]撤销的相关命令:reset、revert、checkout

基本概念如果不清晰上面的四个概念,请查看廖老师的git教程这里我多说几句:最开始我使用git的时候,我并不明白我为什么写完代码要用git的一些列指令把我的修改存起来。后来用多了,也就明白了为什么。gi...

利用shell脚本将Mysql错误日志保存到数据库中

说明:利用shell脚本将MYSQL的错误日志提取并保存到数据库中步骤:1)创建数据库,创建表CreatedatabaseMysqlCenter;UseMysqlCenter;CREATET...

MySQL 9.3 引入增强的JavaScript支持

MySQL,这一广泛采用的开源关系型数据库管理系统(RDBMS),发布了其9.x系列的第三个更新版本——9.3版,带来了多项新功能。...

python 连接 mysql 数据库(python连接MySQL数据库案例)

用PyMySQL包来连接Python和MySQL。在使用前需要先通过pip来安装PyMySQL包:在windows系统中打开cmd,输入pipinstallPyMySQL ...

mysql导入导出命令(mysql 导入命令)

mysql导入导出命令mysqldump命令的输入是在bin目录下.1.导出整个数据库  mysqldump-u用户名-p数据库名>导出的文件名  mysqldump-uw...

MySQL-SQL介绍(mysql sqlyog)

介绍结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同...

MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南

在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...