Java 17 NIO 知识点 Files 操作 java中files常用的方法

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

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

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

static Object

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

读取文件属性的值。

static <V extends FileAttributeView> V

getFileAttributeView(Path path, Class<V> 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<PosixFIlePermission>

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<String>

lines(Path path)

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

static Stream<String>

lines(Path path, Charset cs)

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

static Stream<Path>

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<? extends OpenOption> options, FileAttribute<?>... attrs)

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

static DirectoryStream<Path>

newDirectoryStream(Path dir)

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

static DirectoryStream<Path>

newDirectoryStream(Path dir, String glob)

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

static DirectoryStream<Path>

newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> 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<String>

readAllLines(Path path)

从文件中读取所有行。

static List<String>

readAllLines(Path path, Charset cs)

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

static <A extends BasicFileAttributes> A

readAttributes(Path path, Class<A> type, LinkOption... options)

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

static Map<String, Object>

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<PosixFilePermission> perms)

设置文件的 POSIX 权限。

static long

size(Path path)

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

static Stream<Path>

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

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

static Stream<Path>

walk(Path start, FileVisitOption... options)

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

static Path

walkFileTree(Path start, FileVisitor<? super Path> visitor)

遍历文件树。

static Path

walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor)

遍历文件树。

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)

将文本行写入文件。

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<T>

该接口主要是封装了文件的属性的值,可以在调用对应的 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<String> 的集合。

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

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

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

相关文章

Java之文件删除 java 删除文件夹下的文件

package com.biubiu.utils; import java.io.File; public class Utils { /** * 删除文件 *...

教你如何彻底干净的卸载Java 如何完全卸载java

一、删除环境变量右键此电脑,属性高级系统设置点击环境变量找到Java相关的系统变量,将其删除在系统变量中找到path,将其中与Java相关的删除二、卸载Java打开控制面板“程序和功能”,卸载与Jav...

已满的C盘如何清理无用的文件 c盘已满怎么清理

一、假设电脑(C盘总共80G)为例:1;Program Files 占用了 1.53G2;Program Files(X86) 占用了 4.68G3;ProgramData 占用了 2.8G4; Wi...

快速释放C盘空间,从清理Windows文件夹开始

新安装的系统还没用多久,突然提示系统备份空间不足?光是 C 盘中 Windows 文件夹就已经占用了54.3G空间,再仔细看了一下,其中 WinSxS 文件夹占用了22.1G空间。C盘 Windows...

五年开发,你还记得Java基础代码中的文件I/O操作么?

文件I/O操作作为Java开发中的一个重要组成部分,主要负责Java代码中对于文件的读写操作,可能对于一些长时间不使用Java文件API的开发者来说早都忘记了相关的操作,下面我们就来详细介绍一下Jav...

Win10彻底删除Java1.8流程 怎么把java删除干净

一定要先将环境变量删除再卸载jdk,最后删除注册表1、点击此电脑,右键【属性】 – 【高级系统设置】 – 【环境变量】,将 JAVA_HOME、CLASS_PATH、PATH 中配置的JDK信息删除2...