File练习
# File练习
# 创建文件夹
在当前模块下的aaa文件夹中创建一个a.txt文件
代码实现:
public class Test1 {
public static void main(String[] args) throws IOException {
//需求:在当前模块下的aaa文件夹中创建一个a.txt文件
//1.创建a.txt的父级路径
File file = new File("myfile\\aaa");
//2.创建父级路径
//如果aaa是存在的,那么此时创建失败的。
//如果aaa是不存在的,那么此时创建成功的。
file.mkdirs();
//3.拼接父级路径和子级路径
File src = new File(file,"a.txt");
boolean b = src.createNewFile();
if(b){
System.out.println("创建成功");
}else{
System.out.println("创建失败");
}
}
}
# 查找文件(不考虑子文件夹)
定义一个方法找某一个文件夹中,是否有以avi结尾的电影(暂时不需要考虑子文件夹)
代码示例:
public class Test2 {
public static void main(String[] args) {
/*需求:
定义一个方法找某一个文件夹中,是否有以avi结尾的电影。
(暂时不需要考虑子文件夹)
*/
File file = new File("D:\\aaa\\bbb");
boolean b = haveAVI(file);
System.out.println(b);
}
/*
* 作用:用来找某一个文件夹中,是否有以avi结尾的电影
* 形参:要查找的文件夹
* 返回值:查找的结果 存在true 不存在false
* */
public static boolean haveAVI(File file){// D:\\aaa
//1.进入aaa文件夹,而且要获取里面所有的内容
File[] files = file.listFiles();
//2.遍历数组获取里面的每一个元素
for (File f : files) {
//f:依次表示aaa文件夹里面每一个文件或者文件夹的路径
if(f.isFile() && f.getName().endsWith(".avi")){
return true;
}
}
//3.如果循环结束之后还没有找到,直接返回false
return false;
}
}
# 查找文件(考虑子文件夹)
找到电脑中所有以avi结尾的电影。(需要考虑子文件夹)
代码示例:
public class Test3 {
public static void main(String[] args) {
/* 需求:
找到电脑中所有以avi结尾的电影。(需要考虑子文件夹)
套路:
1,进入文件夹
2,遍历数组
3,判断
4,判断
*/
findAVI();
}
public static void findAVI(){
//获取本地所有的盘符
File[] arr = File.listRoots();
for (File f : arr) {
findAVI(f);
}
}
public static void findAVI(File src){//"C:\\
//1.进入文件夹src
File[] files = src.listFiles();
//2.遍历数组,依次得到src里面每一个文件或者文件夹
if(files != null){
for (File file : files) {
if(file.isFile()){
//3,判断,如果是文件,就可以执行题目的业务逻辑
String name = file.getName();
if(name.endsWith(".avi")){
System.out.println(file);
}
}else{
//4,判断,如果是文件夹,就可以递归
//细节:再次调用本方法的时候,参数一定要是src的次一级路径
findAVI(file);
}
}
}
}
}
/**
* @ClassName test2
* @Date 2023/3/2 11:04
* @Author diane
* @Description 查询当前文件夹下 是否有.txt结尾的文件 ---- 考虑子文件夹
* 递归调用-深度优先遍历 + list集合保存文件
* @Version 1.0
*/
public class test3 {
public static void main(String[] args) {
test3 test3 = new test3();
File file = new File("D:\\tmp");
List<File> fileList = new ArrayList<>();
// 获取当前文件夹及其子文件夹下的txt文件,存储到list集合中
test3.getTxt(file, fileList);
System.out.println(fileList);
}
/**
* 获取当前文件夹及子文件下的 txt文件,保存到list集合中
* 递归调用-深度优先遍历 + list集合保存文件
* @param file 当前文件夹
* @param list list集合
*/
public void getTxt(File file, List<File> list) {
// 查询当前文件夹下 txt文件,保存到list集合中
File[] filePath = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
// 获取当前文件夹下的.txt文件
if (pathname.isFile() && pathname.getName().endsWith(".txt")) {
list.add(pathname);
}
// 只保留文件夹
return pathname.isDirectory();
}
});
System.out.println(Arrays.toString(filePath));
// filePath 保护判断
if (filePath != null) {
// 递归调用
for (File file1 : filePath) {
getTxt(file1, list);
}
}
}
}
# 删除多级文件夹
需求: 如果我们要删除一个有内容的文件夹 1.先删除文件夹里面所有的内容 2.再删除自己
代码示例:
public class Test4 {
public static void main(String[] args) {
/*
删除一个多级文件夹
如果我们要删除一个有内容的文件夹
1.先删除文件夹里面所有的内容
2.再删除自己
*/
File file = new File("D:\\aaa\\src");
delete(file);
}
/*
* 作用:删除src文件夹
* 参数:要删除的文件夹
* */
public static void delete(File src){
//1.先删除文件夹里面所有的内容
//进入src
File[] files = src.listFiles();
//遍历
for (File file : files) {
//判断,如果是文件,删除
if(file.isFile()){
file.delete();
}else {
//判断,如果是文件夹,就递归
delete(file);
}
}
//2.再删除自己
src.delete();
}
/**
* 删除 file 文件夹
* @param file 要删除的文件夹
*/
public static void deleteFile(File file) {
// 删除文件,返回文件夹目录
File[] files = file.listFiles(pathname -> {
if (pathname.isFile()) {
pathname.delete();
}
return pathname.isDirectory();
});
System.out.println(Arrays.toString(files));
if (files != null) {
for (File path : files) {
// 递归删除 本文件夹里的内容
deleteFile(path);
}
}
// 删除本文件夹
System.out.println(file);
file.delete();
}
}
# 统计大小
需求:统计一个文件夹的总大小
代码示例:
public class Test5 {
public static void main(String[] args) {
/*需求:
统计一个文件夹的总大小
*/
File file = new File("D:\\aaa\\src");
long len = getLen(file);
System.out.println(len);//4919189
}
/*
* 作用:
* 统计一个文件夹的总大小
* 参数:
* 表示要统计的那个文件夹
* 返回值:
* 统计之后的结果
*
* 文件夹的总大小:
* 说白了,文件夹里面所有文件的大小
* */
public static long getLen(File src){
//1.定义变量进行累加
long len = 0;
//2.进入src文件夹
File[] files = src.listFiles();
//3.遍历数组
for (File file : files) {
//4.判断
if(file.isFile()){
//我们就把当前文件的大小累加到len当中
len = len + file.length();
}else{
//判断,如果是文件夹就递归
len = len + getLen(file);
}
}
return len;
}
}
/**
* @ClassName test5
* @Date 2023/3/2 15:13
* @Author diane
* @Description 统计一个文件的总大小
* @Version 1.0
*/
public class test5 {
private static long len = 0;
public static void main(String[] args) {
File file = new File("D:\\tmp\\2");
getLen(file);
// 6,758,524 字节
System.out.println(len);
System.out.println((double)len / 1024 / 1024 + "Mb");
}
public static void getLen(File file) {
File[] files = file.listFiles(pathname -> {
if (pathname.isFile()) {
len += pathname.length();
}
return pathname.isDirectory();
});
if (files != null) {
for (File file1 : files) {
getLen(file1);
}
}
}
}
# 统计文件个数
需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹) 打印格式如下: txt:3个 doc:4个 jpg:6个
代码示例:
/**
* @ClassName test5
* @Date 2023/3/2 14:59
* @Author diane
* @Description 统计一个文件夹中每种文件的个数并打印---- 考虑子文件夹
* @Version 1.0
*/
public class test6 {
public static void main(String[] args) {
File file = new File("D:\\tmp\\2");
Map<String, Integer> map = new HashMap<>();
getCount(file, map);
// 按照规则打印 结果
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue() + "个");
}
}
/**
* 统计文件夹中每种文件的个数
* @param file 要统计的文件夹
*/
public static void getCount(File file, Map<String, Integer> map) {
File[] files = file.listFiles(pathname -> {
if (pathname.isFile()) {
String[] split = pathname.getName().split("\\.");
if (split.length >= 2) {
String key = split[split.length - 1];
map.merge(key, 1, Integer::sum);
}
}
return pathname.isDirectory();
});
if (files != null) {
for (File path : files) {
getCount(path, map);
}
}
}
}
上次更新: 2023 07 3
