IO 的概念
I:Input 输入
O:Output 输出
输入和输出的规定
人为规定: 以CPU为视角,数据远离 CPU 的是输出,数据朝着 CPU 过来的是输入
例子:
1.在电脑上,通过网络下载文件 => 数据通过网卡到达硬盘上 => 输入
2.在电脑上,通过网络上传文件 => 输出
3. 把内存的数据保存到硬盘上 => 输出
4. 把硬盘的数据读取到内存中 => 输入
文件的概念
文件本身也是广义的概念,在操作系统中把很多的资源(软件资源/硬件资源)都抽象成文件.
文中所谈到的文件,特指"狭义”的文件,也就是平时保存在硬盘上的这些文件
博主提问:文件夹 是否是 文件 ???
答案:是的,文件夹也是一种文件,称为“目录文件",也是保存在硬盘上
文件的组织结构:N叉树
在硬盘上,存在很多文件和目录,目录又存在一定的"嵌套关系",而整体这一套结构,就是一个树型结构,此处也被称为 N叉树
Linux 下的树结构
为了方便展示,仅打印出了当前目录的下一层
Windous 下的树结构
文件的路径
出现背景: 文件非常多,目录也非常多,目录之间还能嵌套,就需要在上述体系中,能够有一种方式,标识某个具体的文件
(通过这种方式就能具体定位到,从而找到这个文件) => 路径 就诞生了
路径:从根节点出发,一层一层往下走,最终到达目标文件之后,中间这些目录 集合在一起,就构成了"路径"
在 windows 上:目录和目录之间,使用
/
或者\
进行分割
在 Linux 上:目录和目录之间,使用/
进行分割
注:Linux 绝对路径是/
开头, Windows 以盘符
开头的
以 Windows 为例,绝对路径 / 相对路径的理解:
以盘符开头的路径,也称为"绝对路径",另外,操作系统,也支持"相对路径";
绝对路径,起点,是“此电脑";
相对路径,起点可以是任意路径;
Linux 和 Windows 的相对路径/绝对路径规则,完全相同
路径示例:
绝对路径:
"D:\cat.jpg"
"D:\code\java_code\2024"
"D:\code\java_code\2023"
"D:\code\java_code\2022"
"D:\S\QQ\Bin\QQ.exe"
相对路径:
"./Bin/qq.exe"
"./qq/Bin/qq.exe"
"../qq.exe"
../
表示 回到上级目录
./
表示 当前所在的位置
文件的分类
文本文件 VS 二进制文件
硬盘上存的数据是:文本数据或者二进制数据
文本数据:存的是字符串,每个部分都是合法的字符";
文本文件中的"二进制数据"能够构成合法的字符
二进制数据:存什么都可以;
无论是文本,还是二进制,本质上都是10101这样的二进制数据
文件的区分
一个区分二进制文件和文本文件简单粗暴,但是有效的方法:
使用记事本,打开看看,如果不是乱码,就是文本文件;如果是乱码,就是二进制文件
记事本,属于把文件内容,按照文本的方式来理解的,如果能理解了,查表成功了,不能理解就是二进制
注:像记事本编辑器都能自动识别文本是哪种编码方式的
日常常见的一些 .docx
, .pptx
, .mp3
, .mp4
, .pdf
等都属于二进制文件;
.md
, .html
, .java
, .c
,css
等都属于文本文件;
文本文件是给人看的,二进制文件是给程序看的
使用 Java 操作文件
(1)针对文件系统进行操作
Java标准库 提供了 File
类 表示一个文件,进一步的通过 File
提供的方法,就可以进行文件的系统操作
File 类,出自于 java.io
包里面 =》 和输入输出相关的内容,就是在这个包里
1. 创建文件
public static void main(String[] args) throws IOException {
// 创建文件
File f = new File("./test.txt");
f.createNewFile();
// 判断 File 对象描述的文件是否真实存在
System.out.println(f.exists());
// 判断 File 对象代表的文件是否是一个普通文件
System.out.println(f.isFile());
// 判断 File 对象代表的文件是否是一个目录
System.out.println(f.isDirectory());
}
2. 删除文件
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 文件删除
File f = new File("./test.txt");
// 根据 File 对象,删除该文件。成功删除后返回 true
// f.delete();
// 根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行
f.deleteOnExit();
// 把程序阻塞住
scanner.next();
// 判断 File 对象描述的文件是否真实存在
System.out.println(f.exists());
}
3. 创建目录
public static void main(String[] args) {
// 文件创建
File dir = new File("./testDir/aaa/bbb/ccc/ddd");
// 创建 File 对象代表的目录
// dir.mkdir();
// mkdirs 可以创建多级目录
dir.mkdirs();
// 判断 File 对象代表的文件是否是一个目录
System.out.println(dir.isDirectory());
}
4. 重命名文件
public static void main(String[] args) {
// 文件重命名
File f1 = new File("./test.txt");
File f2 = new File("./test.txt");
f1.renameTo(f2);
}
(2)针对文件内容进行操作
读文件,写文件,打开文件,关闭文件;
操作系统本身,针对文件操作的时候,就引入了流概念
Java 中通过 stream
/“流” 这样的一组类,进行上述的文件内容操作
在D盘的目录下,已经存在一个tes.txt
文件,文件内容:小和尚
1. 读文件
public static void main(String[] args) throws IOException {
// 把流对象的创建,写到 try ()里之后
// 此时,代码执行出了 try {} 时,就会自动调用inputStream的 close了
try (InputStream inputStream = new FileInputStream("d:/test.txt")) {
// 读取文件
// 第一种写法
while (true) {
int ret = inputStream.read();
if (ret == -1) {
// 读取完毕
break;
}
System.out.printf("0x%X ", ret);
}
System.out.println();
// 第二种写法
/* while (true) {
byte[] bytes = new byte[1024];
int n = inputStream.read(bytes);
if (n == -1) {
// 读取完毕,n 就是 -1
break;
}
for (int i = 0; i < n; i++) {
System.out.printf("0x%X ", bytes[i]);
}
System.out.println();
}*/
}
}
输出结果:
UTF8 的在线编码转换换
2. 写文件
public static void main(String[] args) {
// 向 test.txt 文件 追加写内容 abcd
try (OutputStream outputStream = new FileOutputStream("d:/test.txt", true);) {
outputStream.write(97);// a
outputStream.write(98);// b
outputStream.write(99);// c
outputStream.write(100);// d
} catch (IOException e) {
throw new RuntimeException(e);
}
}