File类的概述
"File所描述的这个路径可以是一个文件夹也可以是一个文件"
"File所描述的这个路径可以存在,也可以不存在"
File 类只能操作文件或者文件夹本身。
但是不能操作文件里面的数据。
3-File类的静态成员变量
如果使用Java来操作windows
路径
得写成如下的格式:
C:\\Users\\Administrator\\Desktop\\day09资料
因为在Java中\表示转义字符的意思。
简单记忆:
以后在java中写\
"两个\就表示一个\"
因为\在java中也是有特殊含义的,表示转义字符的含义。
\\
第一个\表示转义字符的意思
第二个\表示被转义了。
整体就是第一个\转义了第二个\原本的含义。把他变成了一个简简单单的\、
关于转义字符的解释。
//我想打印一个双引号。
//因为“ 在java中是有特殊含义的。
//表示字符串的开头或者字符串的结尾。
//会认为下面的三个“
//第一个是字符串的开头
//第二个是字符串的结尾
//第三个又是字符串的开头。那么没有结尾不就报错了吗。
//System.out.println(“”“);
//此时怎么办?
//只能改变中间那个“原来的意思。
System.out.println(“\”“);
//第一个“表示字符串的开头
//第二个\改变了距离他最近的那个字符的含义
//这个字符原本的含义是字符串的开头或者结尾,那么转义之后
//就被改变了,变成了一个简简单单的双引号。
//就不能表示字符串的结尾了
4-绝对路径和相对路径
绝对路径:从盘符开始
从根目录开始
相对路径:一定是有一个参照物。
如果你写的是 a.txt
那么这个a.txt是相对于当前项目而言的。
实际存在的位置就是在当前项目下。
aaa\\bbb\\a.txt
就是在当前项目下的aaa文件夹下的bbb文件夹下的a.txt
"参照物:项目本身"
5-File类的构造方法
public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
代码示例:
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname);
// 文件路径名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2);
// 通过父路径和子路径字符串
String parent = "d:\\aaa";
String child = "bbb.txt";
File file3 = new File(parent, child);
// 通过父级File对象和子路径字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);
C:\Users\Administrator\Desktop\day09资料\day08.java
文件:
父级路径:C:\Users\Administrator\Desktop\day09资料\
子级路径:day08.java
C:\Users\Administrator\Desktop\day09资料\day07作业答案\demo14
文件夹
父级路径:C:\Users\Administrator\Desktop\day09资料\day07作业答案
子级路径:demo14
6-File类获取功能的方法
//public String getAbsolutePath() :返回此File的绝对路径名字符串。
//public String getPath() :将此File转换为路径名字符串。
public String getName() :返回由此File表示的文件或目录的名称。
如果是文件去调用这个方法。获得是文件名 + 后缀名。
如果是一个文件去调用 。获得是文件夹的名字。
public long length() :返回由此File表示的文件的长度。
如果是一个文件去调用这个方法,获得是这个文件的大小。
如果是一个文件夹去调用这个方法,获得的大小不确定
“严禁使用文件夹去调用。”
如何求一个文件夹的大小呢?
就要把这个文件夹里面所有的文件都加在一起。
7-File类判断功能的方法
public boolean exists() :此File表示的文件或目录是否实际存在。
public boolean isDirectory() :此File表示的是否为目录。
public boolean isFile():此File表示的是否为文件。
"以后看一个路径,不能仅仅通过是否有后缀就说这是一个文件还是文件夹。"
文件可以没有后缀。
文件夹可以起一个叫做a.txt的名字。
只能通过isDirectory或者isFile两个方法的判断才能确定这个路径表示的是文件还是文件夹。
8-File类创建删除功能的方法
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
//只能创建一个文件,即使调用的File路径没有后缀名,创建的也是一个文件。
public boolean delete():删除由此File表示的文件或目录。
//如果删除的是一个文件,那么是不走回收站的。
//如果删除的是一个文件夹,只能删空文件夹。
// 如果有内容,需要进入文件夹,把里面所有的东西全部删除之后,才能删除。
//public boolean mkdir():创建由此File表示的目录。
public boolean mkdirs():创建由此File表示的目录,包括任何必需但不存在的父目录。
//—————————————————————————————————
File 类
“File 用来描述路径的。”
“File 可以表示一个文件也可以表示一个文件夹”
“可以存在也可以不存在”
绝对路径:一定是从盘符开始的。
相对路径:参照物的。
“相对当前项目而言的。”
a.txt //表示着这个a.txt所在的位置就是在当前项目下
aaa\bbb\a.txt 表示着这个在当前项目下的aaa文件夹里面去找。
转义字符:
“在java中两个\表示一个\”
File 类中的一些方法:
1,构造方法。
a,是把一个字符串变成一个File对象。
b,c 拼接
C:\\aaa\\a.txt
父级路径:一般会认为是除了自己以外的所有 C:\\aaa
子级路径:(一般会认为就是自己)a.txt
2.成员方法。
getName()
如果是一个文件,那么获得是文件名 + 后缀名
如果是一个文件夹,那么获得是文件夹的名字
length()
如果是一个文件,获得是这个文件的大小
如果是一个文件夹,不能调用这个方法。
exists() //判断当前路径是否存在
isDirectory() //是否为一个文件夹
isFile() //是否为一个文件
File f = new File("C:\\aaa\\a.txt");
//此时无法断定f表示的就是一个文件的路径。
//必须要通过isFile的断定才能判断。
因为在系统中文件夹也可以起名 a.txt
文件也可以没有后缀名
"在操作系统中,路径一定要是唯一的"
举例:
如果桌面上已经有一个文件夹为 aaa
那么我们不能再新建一个文件没有后缀名的aaa
createNewFile() //创建一个文件。且只能创建文件。
//必须要保证这个路径的父级路径一定要存在,否则直接报错。
delete():
如果是一个文件,那么可以删除,但是不走回收站
如果是一个文件夹,那么只能删空文件夹,里面有内容哪怕就仅仅是一个其他的空文件夹也不能删除。
mkdirs(); 创建多级文件夹,包括单级也可以。
//—————————————————————————————————
9-File类遍历(文件夹)目录功能
//list
File [] listFile()
进入到调用者文件夹里面,把这个文件夹里面所有的文件和文件夹的路径都放到一个File类型的数组中返回。
返回值File[]装的是调用者文件夹里面所有文件和文件夹的路径
细节:
1,如果调用者是一个文件夹,那么返回值正常。
2,如果调用者是一个文件,那么会报错
3,如果调用者是一个不存在的路径,那么会报错
4,如果调用者是一个空文件夹,那么会返回一个长度为0的数组。
5,如果调用者是一个系统权限的文件夹,那么此时也会报错。
10-递归概念&分类&注意事项
递归是算法中的一种
在书写的时候,就是方法在内部调用自己。
写法:
如果脱离了IO。我们一般是不写递归的。
递归大多数情况下都是跟IO相结合的。
1.不跟IO结合
a,找出递归什么时候结束。
b,找出题目要求的规律。
2.只要会递归跟IO结合的一些练习。
马上就要碰到。
我还是会跟多线程一样,给大家总结4步套路。
所有的,百分之一百, 递归跟IO相结合的都可以使用。
11-练习-使用递归计算1-n之间的和
public class DiGuiDemo {
public static void main(String[] args) {
//计算1~num的和,使用递归完成
int num = 5;
// 调用求和的方法
int sum = getSum(num);
// 输出结果
System.out.println(sum);
}
public static int getSum(int num) {
if(num == 1){
return 1;
}
return num + getSum(num-1);
}
}
12-练习-使用递归计算阶乘
public class DiGuiDemo {
//计算n的阶乘,使用递归完成
public static void main(String[] args) {
int n = 3;
// 调用求阶乘的方法
int value = getValue(n);
// 输出结果
System.out.println(“阶乘为:”+ value);
}
public static int getValue(int n) {
if (n == 1) {
return 1;
}
return n * getValue(n - 1);
}
}
13-练习-递归打印多级目录
递归跟IO相结合的问题:
四步:
1,进入
2,遍历
3,判断 --- 判断当前是否是一个文件//处理题目的要求
4,判断 --- 判断当前是否是一个文件夹 //递归 --- 传递的路径一定要是次一级路径
public class DiGuiDemo2 {
public static void main(String[] args) {
// 创建File对象
File dir = new File(“D:\aaa”);
// 调用打印目录方法
printDir(dir);
}
public static void printDir(File dir) {
// 获取子文件和目录
File[] files = dir.listFiles();
for (File file : files) {
// 判断
if (file.isFile()) {
// 是文件,输出文件绝对路径
System.out.println("文件名:"+ file.getAbsolutePath());
} else {
// 是目录,输出目录绝对路径
System.out.println("目录:"+file.getAbsolutePath());
// 继续遍历,调用printDir,形成递归
printDir(file);
}
}
}
}
14-综合案例-文件搜索
public class DiGuiDemo3 {
public static void main(String[] args) {
// 创建File对象
File dir = new File(“D:\aaa”);
// 调用打印目录方法
printDir(dir);
}
public static void printDir(File dir) {
// 获取子文件和目录
File[] files = dir.listFiles();
// 循环打印
for (File file : files) {
if (file.isFile()) {
// 是文件,判断文件名并输出文件绝对路径
if (file.getName().endsWith(".java")) {
System.out.println("文件名:" + file.getAbsolutePath());
}
} else {
// 是目录,继续遍历,形成递归
printDir(file);
}
}
}
}
15-FileFilter过滤器的原理和使用
public class DiGuiDemo4 {
public static void main(String[] args) {
File dir = new File(“D:\aaa”);
printDir2(dir);
}
public static void printDir2(File dir) {
// 匿名内部类方式,创建过滤器子类对象
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".java")||pathname.isDirectory();
}
});
// 循环打印
for (File file : files) {
if (file.isFile()) {
System.out.println("文件名:" + file.getAbsolutePath());
} else {
printDir2(file);
}
}
}
}
规则:
调用者(文件夹)
把调用者文件夹里面所有的路径拿过来过滤一遍。
如果满足要求,我就把他放到返回的数组里
如果不满足要求,我就不放到数组里。
“结论:”
dir.listFiles(); //不传递过滤器,那么就把dir这个文件夹里面所有的文件和文件夹都放到返回的数组里
dir.listFiles(过滤器实现类对象);//如果传递过滤器,那么就把满足要求的文件和文件夹放到返回的数组里
//1,过滤器是干嘛用的?
就是用来过滤文件或者文件夹的。
看他是否满足一定的规则。
如果满足了规则,accept方法就会返回一个true
如果不满足规则,accept方法就会返回一个false
//2,过滤器在哪里用?
过滤器单独出现是没有意义的。
依赖于listFiles方法出现的。
当我们进入一个文件夹的时候(listFiles方法)。
我们可以传递一个过滤器的实现类对象。
16-FileNameFilter过滤器的使用和Lambda优化程序
//了解一下。
public static void printDir3(File dir) {
// lambda的改写
File[] files = dir.listFiles(f ->{
return f.getName().endsWith(“.java”) || f.isDirectory();
});
// 循环打印
for (File file : files) {
if (file.isFile()) {
System.out.println("文件名:" + file.getAbsolutePath());
} else {
printDir3(file);
}
}
}
//————————————————————————————
//dir : C:\aaa
public static void printDir2(File dir) {
// 匿名内部类方式,创建过滤器子类对象
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) { // C:\aaa\a.txt
return pathname.getName().endsWith(“.java”)||pathname.isDirectory();
}
});
// 循环打印
for (File file : files) {
if (file.isFile()) {
System.out.println(“文件名:” + file.getAbsolutePath());
} else {
printDir2(file);
}
}
}
//针对于第一种过滤器来讲 accpet方法中只有一个参数。这个参数表示什么?
依次表示调用者文件夹里面的每一个文件或者文件夹的路径。
//————————————————————————————-
public static void printDir3(File dir) {
// lambda的改写
//dir : C:\aaa
File[] files = dir.listFiles(new FileNameFilter(){
@Override
public boolean accept(File d, String name){//d 也是C:\aaa name a.txt
return f.getName().endsWith(“.java”) || f.isDirectory();
}
});
// 循环打印
for (File file : files) {
if (file.isFile()) {
System.out.println("文件名:" + file.getAbsolutePath());
} else {
printDir3(file);
}
}
}
//针对于第二种过滤器来讲
是有两个参数。
第一个参数:实际上就是调用者路径 dir
第二个参数:调用者文件夹里面的 文件夹名 和 文件名。
//——————————
综上所述:
第二种过滤器两个参数如果拼接在一起。
那么就是第一种过滤器的参数。
如果是第一种过滤器:
.getName 就可以得到第二种过滤器的第二个参数。
File[] files = dir.listFiles(new FileNameFilter(){
@Override
public boolean accept(File d, String name){//d 也是C:\\aaa name a.txt
return f.getName().endsWith(".java") || f.isDirectory();
}
});
File[] files = dir.listFiles(
(File d, String name)->{
return f.getName().endsWith(".java") || f.isDirectory();
}
);