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

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

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

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

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

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

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...