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 都一一介绍完毕了。 过个眼瘾, 在这个基础上,再迭代自己项目中实战案例。现在就写到这吧。最近项目比较慢,更新内容略慢。希望能把时间安排的更加高效。
对于编程的学习通常是最简单的,对于实际的项目中,业务才是最主要的。写财务软件不懂财务是写不好财务软件的。
感谢阅读,点赞,关注,收藏。