File类相关的API练习题
1、练习:创建文件
-
需求:
在当前模块下的aaa文件夹中创建一个a.txt文件
package com.app.demo35_File_test;
import java.io.File;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) throws IOException {
/*
练习:创建文件
需求:
在当前模块下的aaa文件夹中创建一个a.txt文件
*/
// 1.创建a.txt的父级路径
File file = new File("comprehensive_exercises\\aaa");
// 2.创建父级路径
// 如果aaa文件夹已经存在,那么此时会创建失败
// 如果aaa文件夹不存在,那么此时会创建成功
file.mkdirs();
// 3.拼接父级路径和子级路径
File src = new File(file, "a.txt");
if (src.createNewFile()) {
System.out.println("创建成功!");
}else {
System.out.println("创建失败!");
}
}
}
创建成功!
Process finished with exit code 0
2、练习:单个文件夹查找文件
-
需求:
定义一个方法找某一个文件夹中,是否有以avi结尾的电影。
(暂时不需要考虑子文件夹)
-
提前在E盘准备好的文件夹:
package com.app.demo35_File_test;
import java.io.File;
public class Test2 {
public static void main(String[] args) {
/*
练习:单个文件夹查找文件
需求:
定义一个方法找某一个文件夹中,是否有以avi结尾的电影。
(暂时不需要考虑子文件夹)
*/
File file = new File("E:\\JavaDevelop\\aaa");
// File file = new File("E:\\JavaDevelop\\aaa\\bbb");
boolean flag = haveAVI(file);
if (flag) {
System.out.println(file + "路径下有以avi结尾的电影~");
} else {
System.out.println(file + "路径下没有以avi结尾的电影~");
}
}
/**
* 找某一个文件夹中是否有以avi结尾的电影
*
* @param file 要找的文件夹
* @return 查找结果:存在返回true,不存在返回false
*/
public static boolean haveAVI(File file) {
// 1.进入到文件夹中,获取所有里面所有的内容
File[] files = file.listFiles();
// 2.遍历files数组,依次得到每个元素
for (File f : files) {
// f: 依次表示文件夹中每一个文件或者文件夹的路径
// 3.判断当前路径下的是否为文件 且 为avi结尾
if (f.isFile() && f.getName().endsWith("avi")) {
// 是,则说明avi结尾的电影存在,返回true
return true;
}
// 否,则继续查找判断下一个路径
}
// 4.循环结束,说明仍然找不到,说明不存在,直接返回false
return false;
}
}
E:\JavaDevelop\aaa路径下没有以avi结尾的电影~
Process finished with exit code 0
3、练习:遍历磁盘查找文件
-
需求:
找到电脑中所有以avi结尾的电影
(需要考虑子文件夹)
-
递归思想:把大问题拆分,拆到某一个文件夹中不包含其他文件夹为止!
-
套路:
以后遇到查找文件的业务基本都是这个套路:
1.进入文件夹 2.遍历数组 3.判断 4.判断
package com.app.demo35_File_test;
import java.io.File;
public class Test3 {
public static void main(String[] args) {
/*
练习:遍历磁盘查找文件
需求:
找到电脑中所有以avi结尾的电影
(需要考虑子文件夹)
分析:
递归思想:把大问题拆分,拆到某一个文件夹中不包含其他文件夹为止!
套路:
以后遇到查找文件的业务基本都是这个套路:
1.进入文件夹
2.遍历数组
3.判断
4.判断
*/
// 先尝试遍历一个磁盘
// File src = new File("C:\\");
// findAVI(src);
// 再尝试遍历电脑中所有的磁盘
findAVI();
}
/**
* 查找电脑中所有以avi结尾的电影
*/
public static void findAVI() {
// 1.获取电脑中所有盘符的数组
File[] arr = File.listRoots();
// 2.遍历数组:依次得到电脑中的每个磁盘路径
for (File f : arr) {
// f: 依次表示电脑中的每个磁盘路径
// 调用findAVI(File src)方法,传入磁盘路径f,查找该磁盘中所有以avi结尾的电影
findAVI(f);
}
}
/**
* 查找磁盘中所有以avi结尾的电影
* @param src 磁盘路径
*/
public static void findAVI(File src) {
// 1.进入文件夹: 获取所有内容的数组
File[] files = src.listFiles();
// 2.遍历数组: 依次得到文件夹中每一个文件或者文件夹
/*
遍历时会有个小bug:NullPointerException
为什么?
因为listFiles方法底层有些小细节:
如果说方法的调用者是需要权限才可以进入的文件夹,
那么listFiles方法就会返回一个null,
因此在运行时会报一个异常:NullPointerException
*/
// 解决办法:对files进行非空判断即可!
if (files != null) {
for (File file : files) {
// 3.判断:file是否为文件
if (file.isFile()) {
// 是文件
// 判断:file是否以avi结尾
if (file.getName().endsWith("avi")) {
// 是,则将文件路径打印出来
System.out.println(file);
}
}else {
// 不是文件
// 那就是文件夹,此时使用递归
// 重新调用findAVI,然后进入当前这个文件夹,继续遍历,继续判断
// 一直到当前这个文件夹中不包含其他文件夹为止!
findAVI(file);
}
}
}
}
}
C:\jdk\demo\变形金刚.avi
C:\jdk\test\aaa\奥特曼.avi
C:\jdk\test\灿烂人生.avi
C:\jdk\小电影.avi
D:\Javadevelop\爱奇艺aa\bbb\jjj\三国演义.avi
D:\Javadevelop\爱奇艺aa\bbb\变形记.avi
E:\JavaDevelop\aaa\bbb\小电影.avi
Process finished with exit code 0
4、练习:删除文件夹
-
需求:
删除一个多级文件夹
-
思路:
- 先删除文件夹里面的所有的内容
- 再删除自己
package com.app.demo35_File_test;
import java.io.File;
public class Test4 {
public static void main(String[] args) {
/*
练习:删除文件夹
需求:
删除一个多级文件夹
思路:
1.先删除文件夹里面的所有的内容
2.再删除自己
*/
File src = new File("D:\\demo");
deleteFiles(src);
}
/**
* 删除一个多级文件夹
* @param src 要删除的文件夹路径
*/
public static void deleteFiles(File src) {
// 1.先删除文件夹里面的所有的内容
// a.进入文件夹:获取所有内容的数组
File[] files = src.listFiles();
// b.判断files数组是否不为null
if (files != null) {
// c.遍历数组:依次得到里面的每一个文件或者文件夹
for (File file : files) {
// d.判断file是否为文件
if (file.isFile()) {
// 是文件,则直接删除
file.delete();
}else {
// 不是文件,是文件夹
// 则利用递归,将文件夹下的所有内容删除完毕之后,最终删除自己
deleteFiles(file);
}
}
// 2.再删除自己
src.delete();
System.out.println("删除成功!");
}else {
System.out.println("该文件夹路径不存在~");
}
}
}
- 第一次运行
删除成功!
Process finished with exit code 0
- 第二次运行
该文件夹路径不存在~
Process finished with exit code 0
5、练习:统计文件夹大小
-
需求:
统计一个文件夹的总大小
-
思路:说白了,就是统计文件夹里所有文件的大小
package com.app.demo35_File_test;
import java.io.File;
import java.math.BigDecimal;
public class Test5 {
public static void main(String[] args) {
/*
练习:统计文件夹大小
需求:
统计一个文件夹的总大小
思路:
说白了,就是统计文件夹里所有文件的大小
*/
File src = new File("E:\\JavaDevelop");
long filesLength = getFilesLength(src);
System.out.println("文件总大小为:" + filesLength + "字节");
System.out.println("文件总大小为:" + (filesLength / 1024) + "KB");
System.out.println("文件总大小为:" + (filesLength / 1024 / 1024) + "MB");
System.out.println("文件总大小为:" + (filesLength / 1024 / 1024 / 1024) + "GB");
}
/**
* 统计文件夹的总大小
*
* @param src 要统计的文件夹
* @return 返回文件夹的总大小
*/
public static long getFilesLength(File src) {
// 先定义长度变量,用于记录文件夹的总大小
int len = 0;
// 1.进入文件夹:获取所有内容的数组
File[] files = src.listFiles();
// 2.遍历数组:依次得到文件夹中每一个文件或者文件夹
for (File file : files) {
// 3.判断file是否为文件
if (file.isFile()) {
// 是文件,则累加该文件的大小
len += file.length();
}else {
// 不是文件,那就是文件夹,则递归,累加该文件夹中每一个文件的大小
len += getFilesLength(file);
}
}
// 3.循环结束,计算完毕,返回文件夹的总大小
return len;
}
}
文件总大小为:2084902801字节
文件总大小为:2036037KB
文件总大小为:1988MB
文件总大小为:1GB
Process finished with exit code 0
6、练习:统计各种文件数量
-
需求:
统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下: txt:3个 doc:4个 jpg:6个 ...
-
思路:
- 看到统计,就要想到计数器思想,但是这个数量太大,所以要使用集合
- 那要使用什么集合?看这个格式不像是键值对?对啦,直接使用Map集合
package com.app.demo35_File_test;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Test6 {
public static void main(String[] args) {
/*
练习:统计各种文件数量
需求:
统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
jpg:6个
...
思路:
1. 看到统计,就要想到计数器思想,但是这个数量太大,所以要使用集合
2. 那要使用什么集合?看这个格式不像是键值对?对啦,直接使用Map集合
*/
File src = new File("E:\\JavaDevelop\\aaa");
HashMap<String, Integer> hm = getFileFormatCount(src);
hm.forEach((key, value) -> System.out.println(key + ": " + value));
}
/**
* 统计文件夹中各种文件的个数并打印
* @param src 要统计的文件夹
* @return 返回Map集合,键:后缀名,值:个数
*/
public static HashMap<String, Integer> getFileFormatCount(File src) {
// 先创建Map集合,用于存储各种文件的后缀名和个数
HashMap<String, Integer> hm = new HashMap<>();
// 1.进入文件夹:获取所有内容的数组
File[] files = src.listFiles();
// 2.遍历数组:依次得到文件夹中的每个文件或者文件夹
for (File file : files) {
// 3.判断file是否为文件
if (file.isFile()) {
// 是文件,例如:a.txt、a.a.md、aaa
// a: 根据"."来截取该文件的名字和后缀
String name = file.getName();
String[] arr = name.split("\\.");
// b: 判断数组的长度是否大于等于2
if (arr.length >= 2) {
// 是,则获取该文件的后缀
String endName = arr[arr.length - 1];
// 判断该后缀是否存在于Map集合中
if (hm.containsKey(endName)) {
// 存在,则说明该后缀不是第一次出现
// 将该后缀原有的个数拿出来进行累加:
// a.根据后缀(key) 获取 对应的个数(value)
int count = hm.get(endName);
count++;
// b.将最新数据放进map集合
hm.put(endName, count);
} else {
// 不存在,则说明该后缀是第一次出现
// 直接将该后缀 和 个数1 放进map集合
hm.put(endName, 1);
}
}
}else {
// 不是文件
// 递归
HashMap<String, Integer> sonMap = getFileFormatCount(file);
// 将递归后的sonMap集合中的值 累加到 hm集合中:
// a.遍历sonMap集合,得到所有文件后缀名(键) 和 个数(值)的对象
Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey(); // 获取后缀名
int value = entry.getValue(); // 获取个数
// 判断hm集合中是否存在该后缀名
if (hm.containsKey(key)) {
// 存在,则说明该后缀名不是第一次出现
// 将该后缀名在hm集合中原有的个数拿出来
int count = hm.get(key);
// 最新数据 = hm原有个数 + sonMap现有个数
count += value;
// 将最新数据放进hm集合中
hm.put(key, count);
} else {
// 不存在,则说明该后缀名是第一次出现
// 将该后缀名 和 个数 放进hm集合中
hm.put(key, value);
}
}
}
}
// 4.循环结束!统计完成,返回Map集合
return hm;
}
}
jpg: 2
txt: 3
avi: 1
ppt: 1
doc: 1
emmx: 2
xls: 1
docx: 1
Process finished with exit code 0