Java 17 File 类的详解篇(java.io的file类是什么类)
Java 17 I/O 基础 File 篇
I/O(输入/输出)在任何的编程语言中该特性都是必不可少的知识点。 在 Java 中如何操作 I/O 呢。让我们来看一看。
首先对于 Java 来说 I/O 相关的操作都是来自 java.base 中 java.io 的包。
通常来说,通过数据流、序列化、以及文件系统来提供系统的输入和输出。
在 Java 中目前分为 2 个体系, 在 Java 1.7 开始提供了 java.nio 的包以及子包,提供了一系列全新的 API。
这些 API 是对原先的 IO 升级。因此很多使用者也称它为:NIO 2。使用这些接口更加容易且高效的访问操作输入、输出。
File
首先操作文件或者目录, 用到的一个文件目录操作类 File。 用来进行文件和目录路径名的抽象表示。
不管是在哪种操作系统中, 只要是有文件系统都会有对应的路径名称字符串。包含文件和目录。一般情况下关于路径的字符串有两个部分组成:
第一部分是可选的饿系统相关前缀字符串,例如 Windows 中的磁盘驱动器说明符,Unix 或者 Linux 的根目录 “/”。在抽象层次描述路径中的每个后续的名称都可以表示成一个目录,比如计算机名称为一个目录。通常情况下抽象的路径名转换成对应的字符串时,每个名称(目录)和下一个名称(目录或文件)中间都有一个由默认分隔符进行分隔,默认情况下使用 file.separator 定义。File 类中提供了对应的公共静态字段 separator 和 separatorChar。为什么要定义这个静态字段, 主要是因为不同的操作系统分隔符略有不同。为了保证程序的通用性,JVM 底层为我们优化了使用方法,不需要我们在写代码的时候再去判断系统的类型, 而写不同的代码。
对于路径而言, 会涉及两个路径相关的概念。
绝对路径 和 相对路径 注意理解这两个概念的含义。在以后的开发中大量的使用该概念。
绝对路径: 不管怎么变化,都不会影响的路径。
相对路径: 相对当前目录而言,可以找到的路径, 但是层级变化会导致结果有影响。
举个例子:就定位我们的所在位置而言,某某省某某市某某县某某乡某某村余某某。这个名字就类似绝对路径,不管放到那这个余某某就是这个村的余某某。但是相对路径,就是相对而言,比方你现在在某某乡,你可以说找某某村的余某某。这样就可以找到, 但是你要到县里找某某村的余某某,就找不到了。因为缺少了乡这个单位。
或者
//绝对路径
D:\miaozi\java\hello.java
java\hello.java
通常情况下使用 “.” 来标识当前目录。我的知识体系里面是这样, 不知道有没有操作系统里面不使用 “.” 标识当前目录的。可以评论告诉我。
对于目录和文件会有不同的访问权限, 当没有权限访问某个目录和文件时会触发访问失败的异常。
File 的定义
public class File implements Serializable, Comparable
该类提供了 4 个公共的静态常量。
该类提供了 4 个构造函数。 分别如下图所示:
第一种方式:
File file1 = new File(new File("."), "File01.java");
第二种方式:
File file2 = new File("File01.java");
第三种方式:
File file3 = new File(".", "File01.java");
第四种方式:
File file4 = new File(new URI("file:///E:/Code/MzOpenSource/backend/javase17-tutorial/code/chapter17/file/File01java"));
完整的演示和运行效果:
这里直接使用 System.out 打印了对象信息, 显示的内容是对应的路径信息。可以通过对象的 toString() 进行重写。
这里只要指导 getPath() 是获得一个路径就好了。通常是将一个抽象路径名转换为路径名字符串。
需要注意的是, 针对 File 类只是对文件和目录的操作, 而不会涉及到内容。内容使用输出流和输入流进行操作。
对于目录和文件, 最基本的操作就是查看目录和文件,以及新增文件或目录,以及修改文件名,目录名等操作。
当然也会有一些判断方法,判断是否存在目录和文件。
该类的所有方法如下图所示:
canExecute()、anRead() 以及 canWrite() 方法分别代表的是, 是否有执行权限, 是否有读权限,是否有写权限。演示代码如下, 看下效果是否和你想的一致。
让我们来看看如何创建文件和目录
创建文件
创建文件的代码如下,创建一个 Test.java 文件:
先用 ls 命令查看当前目录文件信息。然后执行创建代码。
需要注意的是, 该创建必须保证创建的文件不存在, 如果文件已经存在就会创建失败。
也有两个静态方法可以直接创建文件。
运行效果如下:
其中输出的是文件创建所在目录。
创建目录
需要注意mkdir() 和 mkdirs() 的区别。mkdir 不能夸目录创建。例如: D:/test 目录存在, 创建 D:/test/t 就可以创建成功, 但是如果 D:/test/t/t2 就会创建失败。 如果不清楚目录中是否有不存在的目录, 可以使用 mkdirs 方法创建。
删除文件或目录
文件有创建就会有销毁,毕竟没有绝对的永恒。只有短暂的绽放。
目录也一样,毕竟诞生就是为了消亡。只不过怎么让消的过程更加有意义。
在当前目录创建一个 1.txt 的文件。
使用 delete 方法删除。 或者删除一个目录同样使用该方法。
File file = new File("Test");
System.out.println(file.delete());
如果删除的是一个目录, 必须保证目录中不能包含文件或者目录,只能是一个空目录。 否则将如法删除。
示例如下:
运行效果:
这里 Test 目录删除失败了。 因为该目录中还存放的有一个文件。
file = new File("Test/2.txt");
System.out.println(file.delete());
可以先删除该文件, 再删除 Test 即可 new File("Test").delete()。
重命名文件或者目录
除了操作的, 剩下的就是一些读取目录和文件的方法, 以及对应状态的方法。
举例如下:
还有一些文件和目录相关的磁盘或者分区的查询。
当然了, 既然有分区, 和目录就有目录的内容查询。 针对文件和目录的查询都是以 list 开头的方法。
其中有一个静态的返回 File 数组的一个方法。 listRoots() 列出文件系统可用的根目录。
File[] files = File.listRoots();
for (File file : files) {
System.out.println(file);
}
然后有两种形式的查询目录和文件的方式,一是返回字符串, 二是返回一个 File 数组, 并且两种都会有一个正常模式和过滤器模式。
先看看返回字符串的方式。
这里因为 FilenameFilter 是一个 @FunctionalInterface 函数式接口,所以使用 Lambda 表达式。当然也可以使用接口实现的方式。查看 list(FilenameFilter filter) 的源码就可以看到过滤的方式。先获得所有的目录和文件, 然后再进行处理。最后返回对应的符合过滤器规则的路径。
当然也可以直接使用返回 File 数组对象的方式。 使用方式和上面类似,只是返回值发生了变化。
对于 File 数组, 提供了一个单独的过滤方法。 代码如下, 通过 File 对象进行处理过滤。
关于读取和写入权限, 下一章进行文件内容读取的时候进行演示。这篇文章内容不少。 但是知识点没有难点。
希望对你有所帮助。感谢您的阅读。
关注, 收藏, 点赞。