Java递归遍历文件,根据文件大小排序

本文介绍了在Java中递归遍历文件时遇到的NullPointerException错误及其解决方案,包括错误原因分析、两种解决方式,并提供了解决异常的代码示例。此外,还讨论了ArrayList.sort()方法抛出的IllegalArgumentException错误及其原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Java递归遍历文件NullPointerException错误在这里插入图片描述

源代码

package file;

import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;

public class Demo {
	public static void main(String[] args) {
		System.out.println("start...");
		File f = new File("C:/WINDOWS");

		ArrayList<File> fileList = new ArrayList<>();
		findFiles(f, fileList);
	}
		
	public static void findFiles(File fs, ArrayList<File> fileList) {
		File[] fil = fs.listFiles();

		for(File fl: fil) {
			if(fl.isFile()) {
				if(fl.length() == 0) {
					return;
				}
				fileList.add(fl);
				System.out.println(fileList.size());
			} else {
				findFiles(fl, fileList);
			}
		}
	}
}

错误原因

	遍历系统盘C:/WINDOWS目录下的所有文件,会出现权限问题

分析原因

	修改函数findFiles如下,打印出异常抛出时的文件名,在文件夹中找到对应文件,查看情况

修改函数如下

public static void findFiles(File fs, ArrayList<File> fileList) {
		File[] fil = fs.listFiles();

		try {
			for(File fl: fil) {
				if(fl.isFile()) {
					if(fl.length() == 0) {
						return;
					}
					fileList.add(fl);
					System.out.println(fileList.size());
				} else {
					findFiles(fl, fileList);
				}
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
			System.out.println(fs);
			Scanner sc = new Scanner(System.in);
			sc.next();
			sc.close();
		}
	}

捕获异常文件如下
异常文件为C:\WINDOWS\CSC
文件夹中为
在这里插入图片描述在这里插入图片描述

解决问题

	因为没有文件C:\WINDOWS\CSC权限,fs.listFiles()获取不到当前文件夹下的所有子文件,值为null,即fil为null。所以需要过滤掉这样的文件即可

方式一

if(fil == null) {
	return;
}

方式二
try…catch

二、ArrayList.sort()出现IllegalArgumentException错误

在这里插入图片描述

原因分析

	这个错误就是写比较器的时候少写了返回值的情况,一定不要把返回0这行代码忽悠掉

在这里插入图片描述

三、完整代码如下

package file;

import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;

public class Demo {
	public static void main(String[] args) {
		System.out.println("start...");
		File f = new File("C:/WINDOWS");
//		File f = new File("d:/study");

		ArrayList<File> fileList = new ArrayList<>();
		findFiles(f, fileList);
		findMaxMinOne(fileList);
		findMaxMinTwo(fileList);
	}
	
	public static void findMaxMinTwo(ArrayList<File> fil) {
		fil.sort(new Comparator<File>() {
			@Override
			public int compare(File f1, File f2) {
				if (f1.length() > f2.length()) {
					return 1;
				} else if (f1.length() == f2.length()) {
					return 0;
				} 
				return -1;
			}
		});
		File sFile = fil.get(0);
		File bFile = fil.get(fil.size()-1);
		System.out.println("最大的文件是:" + bFile + ",大小为:" + bFile.length());
		System.out.println("最小的文件是:" + sFile + ",大小为:" + sFile.length());
	}

	public static void findMaxMinOne(ArrayList<File> fil) {
		File sFile = null;
		File bFile = null;
		long small = 1000000000;
		long big = 0;
		for(File fl: fil) {
			if(fl.isDirectory()) {
				System.out.println(fl + "===" + fl.length());
				continue;
			}
			if(fl.length() == 0)
				continue;
			if(fl.length() > big) {
				big = fl.length();
				bFile = fl;
			}
			if(fl.length() < small) {
				small = fl.length();
				sFile = fl;
			}
		}
		System.out.println("最大的文件是:" + bFile + ",大小为:" + big);
		System.out.println("最小的文件是:" + sFile + ",大小为:" + small);
	}
	
	public static void findFiles(File fs, ArrayList<File> fileList) {
		File[] fil = fs.listFiles();

		if(fil == null) {
			return;
		}
		for(File fl: fil) {
			if(fl.isFile()) {
				if(fl.length() == 0) {
					return;
				}
				fileList.add(fl);
				System.out.println(fileList.size());
			} else {
				findFiles(fl, fileList);
			}
		}
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值