1.什么是 I/O?
I/O计算机硬件视角下,非内存数据的读写动作。
这里主要介绍 文件(硬盘)I/O
System.in、System.out、System.err 都是我们接触到的I/O
2.文件概念
狭义上的文件(File):一种抽象的概念,表示硬盘中的数据块
变量、对象是对内存中数据的抽象。 文件是对硬盘中数据的抽象
文件系统(FileSystem):对硬盘上的数据——文件进行直接组织和管理的一个模块
3.硬盘存储 VS 内存存储
(1)硬盘存储
特点:非易失性存储:可以在断电的情况进行数据的保存
低速存储:读写速度远低于内存(弥合速度差,所以针对硬盘数据的读写提出了各种各样的数据结构、算法来解决——尽可能的减少读写频次)
硬盘中的数据更适合:
1.块状读取(block) VS 字节读取(char)
一次性读写很多的数据 和 频繁地进行读写
单纯从 IO 来讲:块状设备 VS 字符设备
2.连续地读写 VS 随机的读写
由于其低速性——缓冲区(buffer)技术
以OS 为代表:会在内存中开辟一段空间——缓冲区,每次写入的东西,等多次写完之后,统一写回硬盘中,而不是写一次就往硬盘写一次,这样就可以减少硬盘地读写频次。
但同时也需要考虑遗留在缓冲区中地数据丢失问题。
达到一定条件后统一写回硬盘地这个条件:
1.应用程序主动要求:冲刷缓冲区 flush(IO中进行 flush 是必不可少的操作,否则数据会丢失)
2.定时冲刷:每隔一定时间冲刷
3.定量冲刷:满了之后必须写到硬盘中
4.对数据的认识
我们一般都把数据抽象成数字(什么进制、什么宽度);如何解释这些数据 -> 文本、像素、波...
文本数据:可以按照一定的字符集编码解释成文本的数据
二进制数据:不可以直接解释成文本
5.文件
(1)逻辑上,一个文件是由两块数据组成的:①文件内容本身“你好世界”的utf-8编码的数据
②该文件的元(meta)数据:管理数据。比如:文件名称叫什么,谁创建的,路径在哪,权限是什么
(2)文件系统按照树形结构,进行文件的组织
(3)目录/文件夹 也是一类文件,只是一种特殊的文件
这些都是管理数据
文件 = 文本文件 or 二进制文件
文件= 普通文件(文件) or 文件夹文件
6.文件的位置/路径
用于定位到是哪个文件的(用树的角度看,就是树上的一个结点)
绝对路径:从一棵树的根结点出发,到达对应结点的完整路径(一定是从根开始)
C: -> Program File -> Java -> a.txt
根 第二层结点 第三层结点 第四层结点
一个唯一的路径一定可以描述一个唯一的结点
Windows 上使用反斜杠\ 作为分隔符
路径存在,并不代表文件一定存在(路径是描述树中一个可能的位置,但并不代表这个位置一定有结点
相对路径:相对 ... 而言的路径。我们当前所在位置/当前工作目录
我们现在在 C:\Windows\目录下,要去找到,那么我们就 回到上一层 -> Program File -> Java -> a.txt ..\Program File\Java\a.txt
我们现在在 C:\Program File\MySQL\目录下,那么我们就 回到上一层 -> Java -> a.txt ..\Java\a.txt
使用 .. 代表回到上一层。
使用 . 就在当前路径下。
使用 ../.. 代表上一层的上一层,也就是父亲的父亲。
7.代码中体现文件
java 提供了 java.io.File 类
File 对象就是对 文件管理数据的抽象。
File() 通过一个路径来创建 File 对象。绝对路径 或者 相对路径。
File对象被创建,并不代表文件一定存在
签名 | 说明 |
File(File parent, String child)
|
根据父目录
+
孩子文件路径,创建一个新的
File
实例
|
File(String pathname)
|
根据文件路径创建一个新的
File
实例,路径可以是绝对路径或者
相对路径
|
File(String parent, String child)
|
根据父目录
+
孩子文件路径,创建一个新的
File
实例,父目录用
路径表示
|
import java.io.File;
public class Main {
public static void main(String[] args) {
// 方法1
{
File file = new File("E:\\learning document\\a.txt");
System.out.println(file);
// 对象存在,文件并不存在
}
// 方法2
{
File parent = new File("E:\\learning document");
File file = new File(parent,"a.txt");
System.out.println(file);
}
// 方法3
{
File file = new File("E:\\learning document","a.txt");
System.out.println(file);
}
}
}
java 程序运行时的我们身处何处?
public class Main2 {
public static void main(String[] args) {
File file = new File("word.txt");
System.out.println(file.getAbsolutePath());
}
}
打印出来的路径就代表我们这个java 程序运行时身处的地方,这个位置是配置出来的
我们身处何处:是一个运行期间的概念,和代码编写的时候是没有关系的。每次运行都有自己的身在何处。也就是说,我写的代码,给 A 用户去用,A 用户在哪个目录下启动,完全由 A 决定。
8.File 类的常见方法
方法
|
说明
|
boolean canExcute() | 判断用户是否对文件有可执行权限 |
boolean canRead()
|
判断用户是否对文件有
可读
权限
|
boolean canWrite()
|
判断用户是否对文件有
可写
权限
|
文件中是被OS 进行了权限管理的,以用户单位进行管理。普通用户 和 管理用户
方法 | 说明 |
boolean isAsolute() | 是否使用绝对路径描述 |
boolean isDirectory() | 存在 && 是目录 |
boolean isFile() | 存在 && 是文件 |
boolean isHidden() | 存在 && 是隐藏文件 |
boolean exists() | 判断文件是否存在 |
方法 |
File getAbsoluteFile() |
String getAbsoluteFile() |
File getCanonicalFile() |
String getCanonicalFile() |
方法 | 说明 |
String getName() | 获取文件名 |
String getParent() | 获取父路径 |
long length() | 文件大小 |
方法 | 说明 |
boolean creatNweFile() |
根据
File
对象,自动创建一个空文件。成功创建后返回 true
|
boolean mkdir() |
创建
File
对象代表的目录
|
boolean mkdirs() |
创建
File
对象代表的目录,如果必要,会创建中间目录
|
boolean delete |
根据
File
对象,删除该文件。成功删除后返回
true
|
void deleteOnExit() |
根据
File
对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行
是彻底删除而不是放入回收站
|
文件的创建:正确的前提:文件的父目录存在 && 文件不存在 crearNewFile()
目录的创建:正确的前提:文件的父目录存在 && 文件不存在 mkdir()
想连同不存在的父目录一起创建 mkdirs()
删除:普通文件可以正常删除,目录删除要求必须是空目录
方法 | 说明 |
boolean renameTo(File dest) | 通过重命名的形式把文件移动成另一个结点 hello\a.txt -> world\a.txt |
方法 | 说明 |
File[ ] listFiles() | 给定起始目录,列出这个目录下的所有文件 |
本质上,就是进行一棵的遍历,对所有结点做条件判断,深度优先的方式进行遍历(递归)