文章目录
文件路径
绝对路径
从盘符开始,一层一层往下找,这个过程得到的路径,就是绝对路径
相对路径
从给定的某个目录出发,一层一层往下找,这个过程得到的路径,就是相对路径
路径的表示
一定要明确,基准目录(工作目录)是啥
在实际生活中我们也有很多这样的例子:
比如你要去一个地方见一个朋友,但是你不知道怎么走,所以他给你一个路径,告诉你在某某标志建筑物开始,先直走,后左转,再直走,右转就到了,这种就是绝对路径,还有一种就是你告诉他你现在在哪个位置,这个位置其实离得比较近了,然后他告诉你怎么走,这种就是相对路径。
文件的分类
文本文件
文本文件,存储的是文本,文本文件的内容都是由ascii字符构成的,对于ascii字符来说,表示范围0~127,后来,又搞了一些其它的编码方式,utf8之类的,就可以针对其它语言文字符号进行编码了,utf8,就可以想象成,一个更大的表,但是始终是有限的。文本文件里存储的数据,就是遵守ascii或者其它字符集编码,所得到的文件,本质上存的是字符(不仅仅是所说的char)
二进制文件
二进制文件存储的是二进制数据,就是没有任何字符集的限制(存啥都行)
文件系统操作
Java标准库,给我们提供了File这个类
- 构造File对象
构造的过程中,可以使用绝对路径/相对路径进行初始化,这个路径所指向的文件,可以是真实存在的,也可以不存在。
- File提供了一些方法
文件内容操作
重要!文件操作一定一定要记得关闭文件!
针对字节流进行操作
InputStream
OutputStream
每次进行写操作,都会将文件里的内容给清空,然后再进行写。
如果你不想它清空再写的话,就在后面加个true:
这样它就会接着写下去了。
针对字符流进行操作
Reader
read方法里面可以传一个数组,就能一次读取多个字符了,读的字符放在数组里。
Writer
如果你想直接读一行,利用Scanner里面套上一个InputStream。
案例
import java.io.*;
import java.util.Scanner;
public class IODemo9 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 1. 先让用户指定一个要搜索的根目录
System.out.println("请输入要扫描的根目录: ");
File rootDir = new File(scanner.next());
if (!rootDir.isDirectory()) {
System.out.println("输入有误, 您输入的目录不存在!");
return;
}
// 2. 让用户输入一个要查询的词.
System.out.println("请输入要查询的词: ");
String word = scanner.next();
// 3. 递归的进行目录/文件的遍历了
scanDir(rootDir, word);
}
private static void scanDir(File rootDir, String word) {
// 列出当前的 rootDir 中的内容. 没有内容, 直接递归结束
File[] files = rootDir.listFiles();
if (files == null) {
// 当前 rootDir 是一个空的目录, 这里啥都没有.
// 没必要往里递归了
return;
}
// 目录里有内容, 就遍历目录中的每个元素
for (File f : files) {
System.out.println("当前搜索到: " + f.getAbsolutePath());
if (f.isFile()) {
// 是普通文件
// 打开文件, 读取内容, 比较看是否包含上述关键词
String content = readFile(f);
if (content.contains(word)) {
System.out.println(f.getAbsolutePath() + " 包含要查找的关键字!");
}
} else if (f.isDirectory()) {
// 是目录
// 进行递归操作
scanDir(f, word);
} else {
// 不是普通文件, 也不是目录文件, 直接跳过
continue;
}
}
}
private static String readFile(File f) {
// 读取文件的整个内容, 返回出来.
// 使用字符流来读取. 由于咱们匹配的是字符串, 此处只能按照字符流处理, 才是有意义的.
StringBuilder stringBuilder = new StringBuilder();
try (Reader reader = new FileReader(f)) {
// 一次读一个字符, 把读到的结果给拼装到 StringBuilder 中. 统一转成 String
while (true) {
int c = reader.read();
if (c == -1) {
break;
}
stringBuilder.append((char)c);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
}