操作系统文件&IO
目录
1.文件的种类
从开发角度来讲,可以把文件分成两类:
1.1文本文件。
是以纯文本形式存储数据的文件,内容由可打印字符组成,不包含特殊格式或二进制数据。常见的扩展名包括.txt、.csv、.json等。
1.2二进制文件。
是由计算机直接处理的非文本文件,以二进制格式存储数据。与文本文件不同,二进制文件包含不可打印的字符和复杂数据结构(如图像、音频、可执行程序等),通常需要特定软件解析。
二进制文件的常见类型
- 可执行文件(如
.exe、.dll):包含机器代码,由操作系统直接运行。 - 媒体文件(如
.jpg、.mp3):存储图像、音频或视频的压缩数据。 - 数据库文件(如
.db、.bin):以二进制形式保存结构化数据。 - 归档文件(如
.zip、.rar):通过二进制编码实现压缩和打包。
在实际开发中要判断一个文件时文本文件还是二进制文件简单粗暴的方式就是,直接使用记事本打开,打开之后如果是乱码就是二进制文件,不是乱码,可以看懂,就是文本文件。
2.File用于操作文件系统
2.1File的构造方法
| 签名 | 说明 |
| File(File parent, String child) | 根据⽗⽬录+孩⼦⽂件路径,创建⼀个新的File实例 |
| File(String pathname) | 根据⽂件路径创建⼀个新的File实例,路径可以是绝 对路径或者相对路径 |
| File(String parent, String child) | 根据⽗⽬录+孩⼦⽂件路径,创建⼀个新的File实 例,⽗⽬录⽤路径表⽰ |
这里的参数String文件路径使用绝对路径和相对路径均可。
2.2File的方法
| 修饰符及返回值类型 | ⽅法签名 | 说明 |
| String | getParent() | 返回File对象的⽗⽬录⽂件路径 |
| String | getName() | 返回FIle对象的纯⽂件名称 |
| String | getPath() | 返回File对象的⽂件路径 |
| String | getAbsolutePath() | 返回File对象的绝对路径 |
| String | getCanonicalPath() | 返回File对象的修饰过的绝对路径 |
| boolean | exists() | 判断File对象描述的⽂件是否真实 存在 |
| boolean | isDirectory() | 判断File对象代表的⽂件是否是⼀ 个⽬录 |
| boolean | isFile() | 判断File对象代表的⽂件是否是⼀ 个普通⽂件 |
| boolean | createNewFile() | 根据File对象,⾃动创建⼀个空⽂ 件。成功创建后返回true |
| boolean | delete() | 根据File对象,删除该⽂件。成功 删除后返回true |
| void | deleteOnExit() | 根据File对象,标注⽂件将被删 除,删除动作会到JVM运⾏结束时 才会进⾏ |
| String[] | list() | 返回File对象代表的⽬录下的所有 ⽂件名 |
| File[] | listFiles() | 返回File对象代表的⽬录下的所有 ⽂件,以File对象表⽰ |
| boolean | mkdir() | 创建File对象代表的⽬录 |
| boolean | mkdirs() | 创建File对象代表的⽬录,如果必 要,会创建中间⽬录 |
| boolean | renameTo(File dest) | 进⾏⽂件改名,也可以视为我们平 时的剪切、粘贴操作 |
| boolean | canRead() | 判断⽤⼾是否对⽂件有可读权限 |
| boolean | canWrite() | 判断⽤⼾是否对⽂件有可写权限 |
3.文件内容的读写——数据流
数据流的种类有很多种,但主要分为两种:
1.字节流
在读写文件时,以字节为单位,针对二进制文件使用的。
如果是字节流使用InputStream关键字进行输入,从文件中读数据。
InputStream的方法:
| 修饰符及返回值类型 | ⽅法签名 | 说明 |
| int | read() | 读取⼀个字节的数据,返回-1代表 已经完全读完了 |
| int | read(byte[] b) | 最多读取b.length字节的数据到b 中,返回实际读到的数量;-1代表 以及读完了 |
| int | read(byte[] b, int off, int len) | 最多读取len-off字节的数据到b 中,放在从off开始,返回实际读 到的数量;-1代表以及读完了 |
| void | close() | 关闭字节流 |
InputStream 只是⼀个抽象类,要使⽤还需要具体的实现类。关于InputStream的实现类有很多,基 本可以认为不同的输⼊设备都可以对应⼀个InputStream类,我们现在只关⼼从⽂件中读取,所以使 ⽤FileInputStream
FileInputStream 的⽅法
| 签名 | 说明 |
| FileInputStream(Filefile) | 利⽤File构造⽂件输⼊流 |
| FileInputStream(Stringname) | 利用⽂件路径构造⽂件输⼊流 |
代码实现
ublic class Main {
public static void main(String[] args) throws IOException {
try (InputStream is = new FileInputStream("hello.txt")) {
while (true) {
int b = is.read();
if (b == -1) {
break;
}
System.out.printf("%c", b);
}
}
}
}
如果是字节流使用OutputStream关键字进行输入,往文件里写数据。
OutputStream的方法:
| 修饰符及返回值类型 | ⽅法签名 | 说明 |
| void | write(int b) | 写⼊要给字节的数据 |
| void | write(byte[] b) | 将b这个字符数组中的数据全部写 ⼊os中 |
| int | write(byte[] b, int off, int len) | )将b这个字符数组中从off开始的 数据写⼊os中,⼀共写len个 |
| void | close() | 关闭字节流 |
| void | flush() | 重要:我们知道I/O的速度是很慢 的,所以,⼤多的OutputStream 为了减少设备操作的次数,在写数 据的时候都会将数据先暂时写⼊内 存的⼀个指定区域⾥,直到该区域 满了或者其他指定条件时才真正将 数据写⼊设备中,这个区域⼀般称 为缓冲区。但造成⼀个结果,就是 我们写的数据,很可能会遗留⼀部 分在缓冲区中。需要在最后或者合 适的位置,调⽤flush(刷新)操 作,将数据刷到设备中。 |
OutputStream 同样只是⼀个抽象类,要使⽤还需要具体的实现类。我们现在还是只关⼼写⼊⽂件 中,所以使⽤FileOutputStream
代码实例
public class Demo9 {
public class Main {
public static void main(String[] args) throws IOException {
try (OutputStream os = new FileOutputStream("output.txt")) {
os.write('H');
os.write('e');
os.write('l');
os.write('l');
os.write('o');
os.flush();
}
}
}
}
2.字符流
在读写文件时,以字符为单位,针对文本文件使用的。
如果是字符流使用Reader关键字进行输入,从文件中读数据。
调用read()时主要分为三种在
1.read() 调用一次读取一个字节。
2.read(byte[] b) 一次读取若干个字节,读取到参数b中
3.read(byte[] b , int off , int len) 有非常大的数组,每次读操作都把数据存放到数组的某个部位。
package File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Demo3 {
public static void main(String[] args) {
try(Reader reader = new FileReader("file.txt")) {
while(true) {
int c= reader.read();
if(c == -1){
break;
}
System.out.println((char)c);
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
如果是字符流使用Writer关键字进行输出,往文件里写数据。
调用writer()时主要分为三种在
1.write() 调用一次写一个字节。
2.write(byte[] b) 一次写若干个字节,读取到参数b中
3.write(byte[] b , int off , int len) 有非常大的数组,每次写操作都把数据存放到数组的某个部位。
package File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Demo4 {
public static void main(String[] args) {
try(Writer writer = new FileWriter("./output.txt",true)){
writer.write("hello word");
} catch (IOException e) {
}
}
}
补充:字节流和字符流在读取时(例如读取“你好”),
字节流读到的是文件中的原始数据,在硬盘上保存文件的时候就是6个字节,utf8编码。
字符流在读取的时候,就会根据文件内容编码格式,进行解析。
read()一次会得到3个字节(按照utf8解析的)
返回的时候,针对3个字节进行了转码,拿着3个字节查utf8的码表,‘你’汉字。
read就又把这个汉字在unicode这个码表中再次查询一次,得到unicode的编码值
最终把unicode的编码值返回到char变量中(两个字节)
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)