目录
一、认识文件
想必文件大家都不陌生,文件是存储在计算机系统中的数据集合,它可以包含文本、图像、音频、视频或其他类型的数据。比如下图
文件存储
这里讨论的文件属于狭义上的文件,一般是存储在硬盘上的。这里别忘了硬盘和内存的区别。
1.硬盘存储空间大,内存小。
2.硬盘速度慢,内存快。
3.硬盘的成本低,内存高。
4.硬盘可以持久化存储,内存断电后数据丢失。
硬盘中最常见的是机械硬盘。有两种读写方式:顺序读写和随机读写。
顺序读写是指数据在存储介质上按连续的物理位置进行读取或写入。
数据在物理位置上是连续的,因此存储设备可以以较高的速度进行读写操作,
随机读写是指数据在存储介质上按不连续的物理位置进行读取或写入,即数据的访问是随机的,没有固定的顺序。因此存储设备需要频繁地移动读写头或寻址,这会导致读写操作的速度显著下降。
文件路径
文件的组织一般都是树形结构,如图~
绝对路径
绝对路径是从文件系统的根目录(或最顶层目录)开始,一直到指定文件或目录的完整路径。也就是平常说的“文件地址”。
D:\Program Files (x86)\Dev-Cpp
这里要注意:
绝大多数系统都是用/(斜杠)作为目录的分隔符,只有Windows系统/(斜杠)和\(反斜杠)两者兼容。
相对路径
相对路径是相对于当前工作目录(参考系)而言的路径。相对路径不从文件系统的根目录开始,而是从当前工作目录开始。
假设我们有一个文件系统结构如下(树形):
若设置工作目录是 /home/user/documents:
文件report.docx 的相对路径是 report.docx。
文件vacation.jpg 的相对路径是 photos/vacation.jpg。
若设置工作目录是 /home/user:
文件report.docx 的相对路径是 documents/report.docx。
文件vacation.jpg 的相对路径是 documents/photos/vacation.jpg。
重新设置工作目录是 /home/user/documents/photos:
文件vacation.jpg 的相对路径是 vacation.jpg。
文件report.docx 的相对路径是 ../report.docx。
这里解释一下两个点 ..
..
表示当前目录的上一级目录。即先回到documents目录,再去指向report.docx文件。
文件种类
二进制文件
二进制文件是包含以二进制形式编码的数据的文件,这些数据不是以字符编码表示的,因此不能直接用文本编辑器打开和编辑。不然就会出现乱码的情况。
文本文件
文本文件是包含字符编码数据的文件,这些数据以可读的文本形式表示。
但在速度方面显示是二进制文件更快,毕竟文本文件还要转换成对应的二进制码才可以被机器识别。
文件系统操作
文件系统操作是指在计算机上对文件和目录进行创建、读取、更新和删除(CRUD)等操作的过程,一般是调用File类里面的方法进行操作。
这些方法不用死记硬背,记住一些常用的即可即可,忘记的时候去翻阅下本博客就好了~
package IO;
import java.io.File;
import java.io.IOException;
public class demo1 {
public static void main(String[] args) throws IOException {
File file=new File("D:\\测试\\文件1.txt");
System.out.println(file.getParent());
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
System.out.println(file.exists());
System.out.println(file.isDirectory());//file是否是目录
System.out.println(file.isFile());//file是否问文件
}
}
注意:
一般来讲,文件路径都是单反斜杠,但在代码里都要用双反斜杠(\\),
因为在Java字符串中,反斜杠(\)是一个转义字符,因此需要使用双反斜杠(\\)来表示一个反斜杠.
经典面试题
写一段代码去显示指定目录里面的所有内容(包括子目录以及所有文件)。
假设指定目录是 "D:\测试" ,“测试2”文件夹里面为空。
之前就有提到过文件是由树形结构组织起来的,那就少不了要用递归!
package IO;
import java.io.File;
public class demo2 {
public static void scan(File file) {
//1.先判断是不是目录
if (!file.isDirectory()) {
return;
}
//2.获取目录下的所有文件和子目录
File[] files = file.listFiles();
if (files != null && files.length!=0) {
for (File f : files) {
//如果是文件,打印当前文件的路径
System.out.println(f.getAbsolutePath());
//如果是目录,递归调用scan方法
if (f.isDirectory()) {
scan(f);
}
}
}
}
public static void main(String[] args) {
File file = new File("D:\\测试\\");
scan(file);
}
}
可以当成树形结构的遍历,如果是文件则打印直接路径。如果是目录,则递归调用scan方法。
这里要注意,为啥在for循环的过程中,只判断目录即可。
因为在递归遍历目录下的所有文件和子目录时,不再区分文件和目录,而是对每个 File对象都执行相同的操作:打印其绝对路径。
结果和系统文件一致~
看到最后,如果觉得文章写得还不错,希望可以给我点个小小的赞,您的支持是我更新的最大动力