目录
1. 什么是文件
1.1 概念
1.2 硬盘, 内存, 寄存器之间的区别
1.3 机械硬盘和固态硬盘
2. 文件路径
2.1 绝对路径
2.2 相对路径
3. 文件分类
4. File 类
4.1 属性
4.2 构造方法
4.3 方法
1. 什么是文件
1.1 概念
- 狭义上的文件: 保存在硬盘上的文件
- 广义的上的文件: 操作系统进行资源管理的一种机制. (很多软件/硬件资源, 抽象成文件来表示)
我们主要针对的是狭义上的文件.
注意:
文件夹也是 文件!!
其实 "文件夹" 是我们口中通俗的一个说法, 用专业术语来讲 "文件夹" 其实是 目录(directory).
文件 都是保存在硬盘上的, 其实不止是文件, 包括 MySQL 存储的数据时, 也是保存在硬盘上.
而我们是不能够直接操作硬盘的, 只能通过文件来间接操作硬盘.
其实, 不止是硬盘能够存储数据, 包括内存, cpu 寄存器也也是可以存储数据的, 这里来聊一聊它们三者的区别~
1.2 硬盘, 内存, 寄存器之间的区别
存储空间 | 访问速度 | 成本 | 持久化 | |
硬盘 | 很大 (TB级别) | 很慢 | 便宜. 1TB 固态硬盘, 300-400左右. 机械硬盘更便宜. | 持久化存储, 断电后不会丢失数据. |
内存 | 小 (16GB, 32GB) | 快 (比固态硬盘快了几百上千倍) | 贵. 16GB 的比较新的内存, 400-500左右. | 不能持久化 |
寄存器 | 非常小 (不到1 KB) | 非常快 (比内存快了几百上千倍) | 很贵. cpu 寄存器不单卖~ | 不能持久化 |
1.3 机械硬盘和固态硬盘
其中, 硬盘又分为机械硬盘和固态硬盘.
- 机械硬盘, 通常读写速度, 1s 几百 MB.
- 固态硬盘, 通常读写速度, 1s 几个 GB.
机械硬盘之所以读写速度慢, 是因为受限于其内部的 "机械" 结构.
其中, 盘片用来存储数据, 并在"真空"的环境下高速旋转(7200 / min, 相比计算机来说就很慢了), 磁头用来读写数据, 数据的读写操作需要磁头和盘片的配合机械运动来完成.
而固态硬盘(ssd), 其内部结构是一个更高规模的 "集成电路", 通过 "电子运动" 形式来完成数据的读写操作.
2. 文件路径
路径是 区分/识别 文件的一种方式, 通过路径, 可以识别定位到某一具体的文件.
计算机中, 目录中嵌套着多个不同的目录/文件, 形成了 N 叉树的树形结构.
简单来说, 路径就是从树根(盘符)开始, 到最终的文件, 中间需要经过哪些目录, 把这些目录记录下来, 这就是路径.
分割路径的字符(路径分隔符)有两种:
- / (斜杆) => 在主流的操作系统中, 都是使用 / (斜杆)来分割路径的.
- \ (反斜杠) => Windows 既可以使用 / (斜杆) 也可以使用 \ (反斜杠). Windows 默认为 \ (反斜杠)
但是, 在写代码时, 强烈建议使用 / (斜杆), 因为 \ (反斜杠) 会被当做转义字符使用.
如果想要表示 \ 就需要再次专义:
此外, 路径分为 绝对路径 和 相对路径.
2.1 绝对路径
从盘符(根节点)开始, 将文件所在位置逐级完整的表示出来, 就是绝对路径.
2.2 相对路径
相对路径, 就是相对于基准路径的路径, 也就是说, 想要表示一个相对路径, 必须明确一个 "基准路径".
此外, 还涉及以下两种操作符:
- . => 表示当前基准路径所在的目录位置(从当前位置往后续)
- .. => 代表当前基准路径的上一层路径
举个例子,
假设某文件的绝对路径为: C:\code1\test\demo.txt
- 若基准路径为: C:\code1\test => 则 ./demo.txt
- 若基准路径为: C:\code1 => 则 ./test/demo.txt
- 若基准路径为: C: => 则 ./code1/test/demo.txt
- 若基准路径为: C:\code1\test\XXX => 则 ../demo.txt
- 若基准路径为: C:\code1\test\XXX\YYY => 则 ../../demo.txt
如果我们在代码中写了一个相对路径, 那么基准路径是不确定的, 基准路径取决于程序运行的方式:
- 如果在 IDEA 中直接运行, 基准路径就是项目路径.
3. 文件分类
从开发角度, 文件分为两类:
- 文本文件
- 二进制文件
虽然文件分为两类, 但是所有的文件都是二进制的.(这是冯大佬祖师爷立下的规矩~~)
虽然文件都是二进制的, 但是有些文件比较特殊, 称为文本文件(特殊的二进制文件):
- 文件中的二进制数据恰好能构成字符(不仅仅是 ASCII), 即都能在码表上查到.
- 并且翻译过来的字符又能够构成有意义的信息.
满足以上两个条件的二进制文件, 我们称之为 文本文件.
那如何判断一个文件是文本文件还是二进制文件呢??
有一个简单的方法, 就是使用记事本打开(记事本是按照文本的方式打开的, 自动查码表, 进行翻译工作), 如果打开后内容是一堆乱码(看不懂), 就是二进制文件. 如果打开后的内容不是乱码(能看懂), 就是文本文件.
- 图片, 音频, 视频, 可执行程序 , word docx(富文本, 包含了多种信息)... 都是典型的二进制文件.
- txt纯文本, .java, .c ... 都是典型的文本文件.
综上, 关于文件, 有以下关键要点:
- 文件是存储在硬盘上的
- 目录(directory, 平时说的"文件夹"), 也是文件. 操作系统通过树形结构组织目录和文件.
- 通过路径, 可以识别定位到某一具体文件(路径分为绝对路径和相对路径)
- 文件分为二进制文件和文本文件
4. File 类
Java 标准库也提供了一些能够操作文件的类.
针对文件的操作, 分为以下两种:
- 文件系统操作. 如: 创建文件, 删除文件, 重命名, 创建目录.
- 文件内容操作. 如: 针对一个文件的内容进行读和写.
File 是 java.io 包下的类. File 就可以对文件进行系统操作.
4.1 属性
pathSeparator 是 File 类中的一个静态的成员变量, 表示路径分隔符.
- 在 Windows 上的 pathSeparator 就是 \
- 在其他系统上的 pathSeparator 就是 /
由于 Windows 也支持 / , 所以我们不必使用 pathSeparator , 直接使用 / 来分割路径就可以.
4.2 构造方法
构造方法 | 说明 |
File(File parent, String child) | 根据父目录 + 孩子文件路径,创建⼀个新的 File 实例 |
File(String pathname) | 根据文件路径创建⼀个新的 File 实例,路径可以是绝对路径或者相对路径 |
File(String parent, String child) | 根据父目录 + 孩子文件路径,创建⼀个新的 File 实例,父目录用路径表示 |
其中, 第二个构造方法, File(String pathname), String参数表示的路径即可以是绝对路径, 也可以是相对路径.
注意: 使用 File 类构造方法传入的文件路径, 存不存在均可. File 都可以操作.
4.3 方法
修饰符及返回值类型 | 方法签名 | 说明 |
第一组 | ||
String | getParent() | 返回File对象的父目录文件路径 |
String | getName() | 返回FIle对象的纯文件名称 |
String | getPath() | 返回File对象的文件路径 |
String | getAbsolutePath() | 返回File对象的绝对路径 |
String | getCanonicalPath() | 返回File对象的修饰过的绝对路径 |
注意: getPath 方法得到的路径和构造方法传入的路径有关:
getAbsolutePath 和 getCanonicalPath的区别:
| ||
第二组 | ||
boolean | exists() | 判断File对象描述的文件是否真实存在 |
boolean | isDirectory() | 判断File对象代表的文件是否是⼀个目录 |
boolean | isFile() | 判断File对象代表的文件是否是⼀个普通文件 |
boolean | createNewFile() | 根据File对象,自动创建⼀个空文件。成功创建后返回true |
当创建的 File 对象描述的文件不存在时: 使用 createNewFile 创建文件(通过 IDEA 创建的文件, 基准路径是项目路径): 其中, createNewFile 创建文件成功时, 返回 true, 创建失败时(文件已存在), 返回 false. 但是, 当出现以下情况时, createNewFile 会抛出异常:
| ||
第三组 | ||
boolean | delete() | 根据File对象,删除该文件。成功删除后返回true |
void | deleteOnExit() (不立即删除, 进程结束时才删除) | 根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才会进行 |
其中, delete 是立即删除文件, 而 deleteOnExit 是等进程结束后再删除文件. deleteOnExit 有很多的使用场景:
| ||
第四组 | ||
String[] | list() | 返回File对象代表的目录下的所有文件名 |
File[] | listFiles() | 返回File对象代表的目录下的所有文件,以File对象表示 |
list 和 listFiles 都可以获取当前目录下的子元素, 但不同的是:
| ||
第五组 | ||
boolean | mkdir() | 创建File对象代表的目录 |
boolean | mkdirs() | 创建File对象代表的目录,如果必要,会创建中间目录 |
| ||
第六组 | ||
boolean | renameTo(File dest) | 进行文件改名,也可以视为我们平时的剪切、粘贴操作 |
renameTo 方法可以对文件进行重命名操作:
| ||
第七组 | ||
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
END