Linux:一切皆文件
Java:一切皆对象,因此文件也是对象。
字符串(路径)就是File。因为其构造器的参数就是字符串,打印File的时候也是打印出文件路径。需要调用其getName
方法才能只打印文件名(路径的最后一部分)。
创建File实例,不等于创建了文件(夹)。类似于创建了线程对象不等于开启了线程。
- 创建文件:createNewFile()
- 创建文件夹:mkdir()、mkdirs()
指定路径不存在会导致创建失败。但是mkdirs()
可以创建多级目录,因此可以有不存在的部分。
不指定路径就会使用使用相对路径,默认会在当前项目下创建文件。
文件路径中的分隔符需要转义,因此有两个反斜杠。两个正斜杠就是——注释。
不能依靠后缀名来区分文件和文件夹:
- isFile()
- isDirectory()
查看文件夹里面的东西:
- String[ ] list():只是获得字符串
- File[ ] listFiles():获得File对象。可以空参,也可以传入筛选器FileFilter。
利用 for循环+递归 遍历文件夹,实现各种功能:
- 打印所有文件(包括子文件夹中的文件)
- 获得文件夹的大小:length()
- 复制文件夹:涉及IO流
- 删除文件夹: delete()
注意1: for循环+递归 的模式很像遍历一个N叉树、遍历Graph的代码。for循环中的集合就像是Graph中的临近节点集合。 对于二叉树而言,下面的节点少,所以不用临近节点集合,直接指针指过去。
注意2:递归实现的关键点:1. 结构:if分支+自身调用。 2. 层数要尽可能小,2-3层即可(嵌套的自相似特性会自动保证递归算法可以scale)。
利用字符串的replace
方法去掉文件后缀名
file.getName().replace(".java", "")
利用 FileFilter
接口和字符串的 endsWith
方法筛选文件
private static void printFile(File f) {
// 相当于Graph中的获得临近点集合
File[] files2 = f.listFiles((pathname) ->
// 如果是文件夹或者文件名以特定字符结尾就返回true。
// 由于if返回的是boolean,所以就可以直接与return合并。
pathname.isDirectory() ||
(pathname.isFile() && pathname.getName().endsWith(".java"))
);
// for循环+递归实现遍历
for (File file : files2) {
if (file.isFile()) {
System.out.println(file.getName());
} else {
printFile(file);
}
}
}
网友评论