下面习题思路大多都是:
1.获取路径下所有列表(listfiles),2.遍历文件或文件夹(增强for),3.判断是否是文件(isFile)并直接执行逻辑,4.判断当前是文件夹的情况,可使用递归
需求:使用代码在当前模块下创建一个aaa文件夹,并在aaa文件夹下创建一个a.txt文件。
public class Test01 {
public static void main(String[] args) throws IOException {
//1.创建文件夹
File f1=new File("..\\fileDemo\\aaa");
System.out.println(f1.mkdirs());//true
//2.创建文件
//将父子路径拼接
File f2=new File(f1,"a.txt");
System.out.println(f2.createNewFile());//true
}
}
前:
后:
…\表示项目的上级目录。 .\表示项目的当前目录
需求:定义一个方法找某一个文件夹中,__是否__有以mp4结尾的视频。
(**暂时不需要考虑子文件夹)
思想:把大问题拆分,拆到某一个文件夹中不包含其他文件夹为止
public class Test02 {
public static void main(String[] args) {
//思路:视屏一定是一个文件,可以用ifFile判断,再判断是否endWith("mp4")
//创建要查找的路径的file对象
File file = new File("E:\\aaa");
System.out.println(havaMp4(file));
}
public static boolean havaMp4(File f) {
//1.进入aaa文件夹,而且要获取里面所有的内容
File[] files = f.listFiles();
//2.遍历数组获取里面的每一个元素
for (File file : files) {
//file:依次表示aaa文件夹里面每一个文件或者文件夹的路径
if (file.isFile() && file.getName().endsWith("mp4")) {
return true;
}
}
return false;
}
}
E:\aaa下的所有文件或文件夹
上面这种方式仅仅只能判断当前文件夹,不能考虑aaa的子文件夹(eee、src),就是说它们里面如果有以mp4结尾的文件也是无法探测到的。
改进:
需求:在上面路径基础上,需要考虑子文件夹
思路:递归
public class Test03 {
public static void main(String[] args) {
File file = new File("E:\\aaa");
havaMp4(file);
}
public static void havaMp4(File file) {
//1.获取当前路径下所有列表
File[] files = file.listFiles();
//2.遍历files依次得到aaa里面每一个文件或者文件夹
if (files!=null){
for (File f : files) {
//f表示路径下所有文件或文件夹
if (f.isFile() && f.getName().endsWith("mp4")) {
//3,判断,如果是文件,就可以执行题目的业务逻辑
System.out.println(f);
} else {
//4.当遍历到的是文件夹,则递归
//细节:再次调用本方法的时候,参数一定要是aaa的次一级路径
havaMp4(f);
}
}
}
}
}
控制台:
E:\aaa\eee\WeChat_20240204201838.mp4
实际上E:\aaa\eee下确实有一个mp4文件,
上面我们在遍历当前路径下的内容时做了非空判断,为什么?
因为有可能访问到隐藏的文件,此时会返回null
上面是获取E盘下的aaa文件夹,同理我们可以获取电脑中所有mp4文件
public class Test03 {
public static void main(String[] args) {
//调用这个方法即可获取电脑上所有mp4文件
findInComputer();
}
public static void findInComputer(){
//listRoots获取电脑上所有盘
File[] files = File.listRoots();
for (File file : files) {
havaMp4(file);
}
}
public static void havaMp4(File file) {
//1.获取当前路径下所有列表
File[] files = file.listFiles();
//2.遍历files依次得到aaa里面每一个文件或者文件夹
if (files!=null){
for (File f : files) {
//f表示路径下所有文件或文件夹
if (f.isFile() && f.getName().endsWith("mp4")) {
//3,判断,如果是文件,就可以执行题目的业务逻辑
System.out.println(f);
} else {
//4.当遍历到的是文件夹,则递归
//细节:再次调用本方法的时候,参数一定要是aaa的次一级路径
havaMp4(f);
}
}
}
}
}
需求:删除一个多级文件夹。
如果是删除一个单级文件夹(一个空白文件夹),直接调用删除方法即可,但是删除多级可以用到递归思想,不断删除
public class Test4 {
public static void main(String[] args) {
/*
删除一个多级文件夹
//之前我们说过删除方法只能*删除文件或*空白文件夹
如果我们要删除一个有内容的文件夹
1.先删除文件夹里面所有的内容
2.再删除自己
*/
File f = new File("E:\\aaa");
delete(f);
}
public static void delete(File file) {
/*先删除文件夹里面所有的内容*/
//1.获取当前路径所有内容
File[] files = file.listFiles();
//2.遍历files依次得到aaa里面每一个文件或者文件夹
for (File f : files) {
if (f.isFile()) {
//如果是文件直接删除即可
f.delete();
} else {
//如果是文件夹,就递归
delete(f);
}
}
/*最后删除自己*/
file.delete();
}
}
删除前:
删除后:
aaa文件夹被删除
注意点:若此时aaa文件夹下有某个文件在另一处打开的话,该文件将无法被删除
需求: 统计一个文件夹的总大小
public class Test05 {
public static void main(String[] args) {
File file=new File("E:\\aaa");
System.out.println(getLen(file));
}
public static long getLen(File file){
//1.获取当前路径下所有列表
File[] files = file.listFiles();
//2.遍历每一个文件或文件夹
long len=0;
for (File f : files) {
if (f.isFile()){
//如果是文件直接计算文件大小
len=len+f.length();
}else {
//如果是文件夹,递归,主要加上之前的len
len=len+getLen(f);
}
}
return len;
}
}
控制台:
7440
完全一样:
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
如:
txt:3个
doc:4个
jpg:6个
思路:看见统计可以用map集合
键放后缀名 值放次数
public class Test06 {
public static void main(String[] args) {
/*
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
jpg:6个
*/
File f = new File("E:\\aaa");
HashMap<String, Integer> count = getCount(f);
System.out.println(count);
}
/**
* 要考虑的情况
* a.txt
* a.a.txt
* aaa(不需要统计的)
*/
public static HashMap<String, Integer> getCount(File file) {
//定义map集合
HashMap<String, Integer> hm = new HashMap<>();
//获取当前路径下所有列表
File[] files = file.listFiles();
//遍历获取所有文件或文件夹
for (File f : files) {
if (f.isFile()) {
String name = f.getName();
String[] split = name.split("\\.");
//获取字符数组的最后一个片段,就是防止特殊情况有两个点
String endName = split[split.length - 1];
if (hm.containsKey(endName)) {
//如果map集合内有当前后缀,说明改后缀已经出现过,拿出值加一即可
Integer value = hm.get(endName);
value++;
hm.put(endName, value);
} else {
//如果没有当前后缀说明,当前后缀没有出现过
hm.put(endName, 1);
}
} else {
//如果是文件夹,递归
//但是有一个问题,子文件夹的个数如何与之前的已经统计的个数联系起来
HashMap<String, Integer> sonMap = getCount(f);
//首先遍历获取,子文件夹中不同后缀的个数各有多少个
Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();//后缀
int value = entry.getValue();//后缀
if (hm.containsKey(key)) {
//如果已经统计的map集合中有当前后缀名,则加一块即可,最后放回去即可
Integer i = hm.get(key);
i = i + value;
hm.put(key, i);
} else {
//如果已经统计的map集合中没有当前后缀名,就把当前统计到的放入即可
hm.put(key, value);
}
}
}
}
return hm;
}
}
{mp4=1, txt=7, png=16, webp=11}