广义上的文件:操作系统进行资源管理的一种机制,很多软件/硬件资源,都抽象成“文件”来表示。 狭义上的文件:保存在硬盘上的文件
当前我们讨论的主要是狭义上的文件。 针对硬盘这种持久化存储的I/O设备,当我们想要进⾏数据保存时,往往不是保存成⼀个整体,⽽是独⽴成⼀个个的单位进⾏保存,这个独⽴的单位就被抽象成⽂件的概念,就类似办公桌上的⼀份份真实的⽂件⼀般。
文件除了内容之外,还有一部分信息,比如文件名,类型,大小等并不作为文件的数据而存在,我们将这些信息称为文件的元信息。


如上图所示,文件类型有文件夹,文本文档等。我们都知道文本文档就是所谓的文件,但是,文件夹其实也是文件! 文件夹是日常生活中的通俗叫法,其实,他的专业名字叫做目录(direction),也是文件的一种。
随着硬盘空间的不断增大,我们一台电脑上可以储存的文件数量越来越多,文件系统的管理难度也就增大。按照层级结构进行组织的方法可以很好的解决管理问题,也就是我们平时学到的树形结构。

一台电脑中能够保存许多文件,这些文件有的甚至文件名文件类型都是相同的,那么如何唯一的标识一个文件呢?那就是用文件路径。
从树根(一般是C盘D盘那种)开始,一直到目标文件,这中间需要经过哪些目录,将这些目录记录下来,就构成了“路径”。
“/”:斜杠 “\”:反斜杠
一般使用/来分割路径中的多级目录,主流操作系统中都是如此,windows除外,windows是使用反斜杠\来分割目录。但是,windows同时也支持/,不过默认windows是使用反斜杠\。 实际写代码时,推荐大家使用斜杠/。因为如果使用反斜杠\,在字符串中需要进行转义。

绝对路径相对路径: 绝对路径就是从根目录到目标文件的路径。 谈到相对路径,就要明确一个基准路径,相对路径是相对于这个基准路径的路径。
./的含义:代表 “当前基准目录” 基准为C:\Users\1\时,./test.txt → 对应C:\Users\1\test.txt 基准为C:\Users\时,./1/test.txt → 对应C:\Users\1\test.txt 基准为C:\时,./Users/1/test.txt → 对应C:\Users\1\test.txt
…/的含义:代表 “基准目录的上一级目录” 基准为C:\Users\1\Desktop时,…/test.txt → 对应C:\Users\1\test.txt
想表达上一级的上一级目录可以使用…/…/test.txt;
那么,如果在代码中写一个相对路径,那么他的基准路径是谁呢?? 1.如果将代码打包成一个jar包,在命令行界面调用并运行程序,那么当前在哪个目录下执行命令,基准路径就是哪个。

2.如果在IDEA中直接执行,那么基准路径就是项目的路径。 比如我的就是:“D:\javacode\java-ee-beginner\javaEE”

此时我们如果创建文件,这个文件就会在项目文件夹中被创建。
从开发的角度来看,文件分为两类: 1.二进制文件 2.文本文件
首先,所有的文件根本上肯定都是二进制的。但是其中有一些文件,他们的二进制数据刚好可以构成字符。
实际开发中判断一个文件是不是文本文件有一种简单粗暴的方法就是直接用记事本打开,打开之后是乱码就是二进制,能看懂就是文本文件。 图片、音频、可执行程序都是典型的二进制文件; txt纯文本,.java,.c都是典型的文本文件
word,docx这样的文件它不仅存储了文本内容,还有各种格式信息,甚至是图片视频等,应该称为富文本文件,并且打开之后确实是乱码,因此属于二进制文件的范畴。 示例:打开一个docx文件


public static void main(String[] args) {
File file = new File("D:\\javacode\\java-ee-beginner\\javaEE/test.txt");
File file = new File("./test.txt");
}“\”在使用时必须使用转义字符修饰。


getCanonicalPath()这个方法直接使用是会报错的,需要抛IOException异常。IOException在文件操作这里是一个很常见的异常。 同时这个方法还是绝对路径的简化版本,他会把路径中的./和…/去掉,给出最精简的结果。


如果我们将路径改为绝对路径传入,路径的输出会变成绝对路径:


不过,虽然我们实例化了一个file对象,但是这个file对象并不是代表着实际的一个文件,创建文件还需要另外的操作。比如:


三点: 1.创建文件的操作会抛输入输出异常 2.创建完成后我们能看到创建出来的文件确实在目标目录下 3.创建文件操作会有Boolean返回值
什么情况会产生异常并且操作返回值为false? 1.硬盘满了 2.没有权限 3.硬盘坏了
这三个条件其实在我们自己的电脑上听不常见的,我们对自己的电脑一般都是最高权限,还有硬盘满了和坏了都是小概率事件。
public static void main(String[] args) throws IOException {
File file = new File("./text.txt");
System.out.println(file.exists());
System.out.println(file.createNewFile());
System.out.println(file.isFile());
System.out.println(file.isDirectory());
}

两个都是删除,不同的是一个是立刻删除一个是进程结束后删除。
进程结束后删除的意义??
应用场景 针对编辑作业文档时突发断电、未手动保存的情况,解释 “文档内容未丢失” 的原因。 核心机制 Office 在编辑文档过程中,会自动生成隐藏的临时文件,并实时保存当前编辑的内容。 不同退出场景的处理逻辑 正常关闭 Office:临时文件会自动删除(对应deleteOnExit功能),下次启动不会提示恢复内容; 异常关闭(如断电):临时文件会保留,下次启动 Office 时会提示恢复未保存的内容。
package File;
import java.io.File;
public class Demo3 {
public static void main(String[] args) throws InterruptedException {
File file = new File("./test.txt");
//System.out.println(file.delete());
file.deleteOnExit();
Thread.sleep(10000);
}
}我们在目标目录内创建一个test.txt文件,使用以上代码我们就能够看到这样的场景:程序开始运行后过了十秒文件自动删除。

package File;
import java.io.File;
import java.util.Arrays;
public class Demo4 {
public static void main(String[] args) {
File file = new File("d:/");
System.out.println(file.isDirectory());
String[] list = file.list();
System.out.println(Arrays.toString(list));
File[] files = file.listFiles();
System.out.println(Arrays.toString(files));
}
}

package File;
import java.io.File;
public class Demo5 {
public static void main(String[] args) {
File file = new File("./test.txt");
System.out.println(file.mkdir());
File files = new File("./test/111/222/333");
System.out.println(files.mkdir());
System.out.println(files.mkdirs());
}
}
mkdir不能创建多级目录,需要使用mkdirs。


从操作系统的角度来看,重命名其实和移动操作本质是一样的。这个速度很快,是O(1)。我们通常叫做剪切。 复制文件,需要遍历目录里的所有数据,是O(N)。
如果移动操作涉及到了跨盘(不是C盘D盘这种),此时就相当于复制+删除,速度就慢了(比如用U盘拷贝东西)。
public class Demo6 {
public static void main(String[] args) {
File file = new File("./test.txt");
File newFile = new File("./src/test.txt");
System.out.println(file.renameTo(newFile));
}
}要求被命名的file必须存在,newFile不存在才可以完成命名操作。
这篇内容围绕文件基础概念与 Java 中 File 类的操作展开:先明确狭义的文件是硬盘上包含内容与元信息的存储单元,目录(文件夹)也属于文件,文件系统以树形结构管理文件;文件分为记事本可读的文本文件、打开显乱码的二进制文件(含.docx 这类带格式的富文本文件)两类。路径方面,Windows 用反斜杠(代码中需转义)、主流系统用斜杠,绝对路径是根目录到文件的完整路径,相对路径基于基准目录(命令行运行 Jar 包时基准为终端目录、IDE 中为项目根目录),通过./(当前目录)、…/(上级目录)表示层级。在 Java 中,File 类通过路径构造对象(仅映射路径不实际创建文件),可获取路径、判断文件状态,通过 createNewFile 创建文件,用 delete(立即删)或 deleteOnExit(进程结束删,适配临时文件场景)删除文件,借助 mkdir(单级)、mkdirs(多级)创建目录,通过 renameTo 实现文件重命名或移动(同盘高效、跨盘需复制删除),还能列出目录内容;而 Office 的临时文件机制,正是通过类似 deleteOnExit 的逻辑,异常关闭时保留文件用于恢复、正常关闭则自动清理。