Java文件操作
1. 文件
我们平时很多时候写的代码,都是保存在内存中的,一旦断电或者退出后,里面的数据全部都会丢失,无法长时间保存,于是,文件的出现,可以有效地解决这个问题。
在针对硬盘这种持久化的IO设备是,当我们想保存数据时,往往并不是保存为一个整体,而是独立为一个个的单位进行保存,这个独立的单位就被抽象为文件的概念。
同时,文件除了有数据内容外,还有一部分和数据无直接关系的信息,例如:文件名,文件类型,文件大小等等,这些信息并不作为文件的数据而存在,因此把这部分的信息视为文件的元信息。
1.1. 树形结构组织和目录
若文件越来越多,那对文件的管理也成为了一个问题,于是有了对文件的系统管理。
对文件的系统管理都是按照层级结构进行租住,也就是数据结构中学习的树形结构,这样,一种专门用来存放管理信息的特殊文件产生了,也就是我们平时所谓的文件夹或者目录。
1.2. 文件路径
1.2.1. 绝对路径
只有树形结构组织,想要定位文件所在的位置,也是一个需要解决的问题,于是,可以从树形结构的角度来看,树中的每个节点都可以被一条从根开始的,一直到达的节点的路径所描述,这种描述方式便被称为文件的绝对路径。
例如:C:\Program Files\Office
1.2.2. 相对路径
若路径不从根节点开始,而是从任意节点出发,来进行路径的描述,这种描述方式便被称为相对路径。
例如:…\Program Files\Office
注意:
.代表当前节点
…代表父节点
1.2.3. 文件数据类型
文件数据常被分为文本数据和二进制数据。
文本数据
可按照一定的字符集编码解释为文本的数据。
二进制数据
不可直接被解释为文本的数据。
2. Java操作文件
在Java中,可以通过java.io.File类来对一个文件(包括目录)进行抽象的描述。电脑有File对象,并不代表真实存在该文件(即File为null)。
2.1. 常用函数
注意
文件创建:文件的父目录存在,并且文件不存在,则可以使用createNewFile()函数创建文件。
目录创建:若文件的父目录存在,并且文件不存在,则可以使用mkdir()函数。若想两天不存在的父目录一同创建,则使用mkdirs()函数。
删除:普通文件则可以直接删除,而目录文件则要求为空目录才可以被删除。
2.2. 文件内容的读写
文件内容的读写也被称为数据流,可以把数据理解为水池中的水,文件理解为是水池,对文件的写操作被认为是向水池中灌水,对文件的度操作被认为是从水池中接水。
因此可以通过使用InputStream和OutputStream类来实现对文件的读写操作。
2.2.1. 文件的读操作
InputStream常用的函数:
但InputStream只是一个抽象类,实际使用中还需要计提的实现类,所以一般使用FileInputStream类。
FileInputStream构造方法
利用 Scanner 进行字符读取
上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,可以使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类。
示例:
import java.io.*;
import java.util.*;
// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "你好中国" 的内容
public class Main {
public static void main(String[] args) throws IOException {
try (InputStream is = new FileInputStream("hello.txt")) {
try (Scanner scanner = new Scanner(is, "UTF-8")) {
while (scanner.hasNext()) {
String s = scanner.next();
System.out.print(s);
}
}
}
}
}
2.2.2. 文件的写操作
OutputStream常用的函数:
OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用 FileOutputStream类。
利用 PrintWriter 找到我们熟悉的方法
但直接用数据流的处理还是会有点不太方便,于是,可以使用PrintWriter类来完成输出。其中这包含我们熟悉的
print、println、printf 方法。
示例:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
try (OutputStream os = new FileOutputStream("output.txt")) {
try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF- 8")) {
try (PrintWriter writer = new PrintWriter(osWriter)) {
writer.println("我是第一行");
writer.print("我的第二行\r\n");
writer.printf("%d: 我的第三行\r\n", 1 + 1);
writer.flush();
}
}
}
}
}