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

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

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

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

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

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

相关推荐

SQL轻松入门(5):窗口函数(sql语录中加窗口函数的执行)

01前言标题中有2个字让我在初次接触窗口函数时,真真切切明白了何谓”高级”?说来也是一番辛酸史!话说,我见识了窗口函数的强大后,便磨拳擦掌的要试验一番,结果在查询中输入语句,返回的结果却是报错,Wh...

28个SQL常用的DeepSeek提示词指令,码住直接套用

自从DeepSeek出现后,极大地提升了大家平时的工作效率,特别是对于一些想从事数据行业的小白,只需要掌握DeepSeek的提问技巧,SQL相关的问题也不再是个门槛。...

从零开始学SQL进阶,数据分析师必备SQL取数技巧,建议收藏

上一节给大家讲到SQL取数的一些基本内容,包含SQL简单查询与高级查询,需要复习相关知识的同学可以跳转至上一节,本节给大家讲解SQL的进阶应用,在实际过程中用途比较多的子查询与窗口函数,下面一起学习。...

SQL_OVER语法(sql语句over什么含义)

OVER的定义OVER用于为行定义一个窗口,它对一组值进行操作,不需要使用GROUPBY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。...

SQL窗口函数知多少?(sql窗口怎么执行)

我们在日常工作中是否经常会遇到需要排名的情况,比如:每个部门按业绩来排名,每人按绩效排名,对部门销售业绩前N名的进行奖励等。面对这类需求,我们就需要使用sql的高级功能——窗口函数。...

如何学习并掌握 SQL 数据库基础:从零散查表到高效数据提取

无论是职场数据分析、产品运营,还是做副业项目,掌握SQL(StructuredQueryLanguage)意味着你能直接从数据库中提取、分析、整合数据,而不再依赖他人拉数,节省大量沟通成本,让你...

SQL窗口函数(sql窗口函数执行顺序)

背景在数据分析中,经常会遇到按某某条件来排名、并找出排名的前几名,用日常SQL的GROUPBY,ORDERBY来实现特别的麻烦,有时甚至实现不了,这个时候SQL窗口函数就能发挥巨大作用了,窗...

sqlserver删除重复数据只保留一条,使用ROW_NUMER()与Partition By

1.使用场景:公司的小程序需要实现一个功能:在原有小程序上,有一个优惠券活动表。存储着活动产品数据,但因为之前没有做约束,导致数据的不唯一,这会使打开产品详情页时,可能会出现随机显示任意活动问题。...

SQL面试经典问题(一)(sql经典面试题及答案)

以下是三个精心挑选的经典SQL面试问题及其详细解决方案,涵盖了数据分析、排序限制和数据清理等常见场景。这些问题旨在考察SQL的核心技能,适用于初学者到高级开发者的面试准备。每个问题均包含清晰的...

SQL:求连续N天的登陆人员之通用解答

前几天发了一个微头条:...

SQL四大排序函数神技(sql中的排序是什么语句)

在日常SQL开发中,排序操作无处不在。当大家需要排序时,是否只会想到ORDERBY?今天,我们就来揭秘SQL中四个强大却常被忽略的排序函数:ROW_NUMBER()、RANK()、DENSE_RAN...

四、mysql窗口函数之row_number()函数的使用

1、窗口函数之row_number()使用背景窗口函数中,排序函数rank(),dense_rank()虽说都是排序函数,但是各有用处,假如像上章节说的“同组同分”两条数据,我们不想“班级名次”出现“...

ROW_NUMBER()函数(rownumber函数与rank区别)

ROW_NUMBER()是SQL中的一个窗口函数(WindowFunction)...

Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析

这篇文章是关于Dify「模板转换」节点的终极指南,解析了基于Jinja2模板引擎的动态文本生成技巧,涵盖多源文本整合、知识检索结构化、动态API构建及个性化内容生成等六大应用场景,助力开发者高效利用模...

Python 最常用的语句、函数有哪些?

1.#coding=utf-8①代码中有中文字符,最好在代码前面加#coding=utf-8②pycharm不加可能不会报错,但是代码最终是会放到服务器上,放到服务器上的时候运行可能会报错。③...