想遍历一个路径内所有.txt文件。但是我这样写只能遍历出每一次文件夹中.txt文件
怎么一次统计出所有.txt文件
public static void eachFile(File a){
int sum=0;
File[] b= a.listFiles();
for (File file : b) {
if (file.isFile()&&file.getName().endsWith(".txt")) {
sum++;
}else {
eachFile(file);
}
}
System.out.println("文件的数量是"+sum);
}
把sum定义放到eachFile函数外面,做全局变量。不然每次进函数就把sum清零了
有偿啊~能运行了,留自己支付宝在自己回答的评论里面,给5R。。不是用毛爷爷来衡量什么,知识都是有偿的
/**
* 获取某目录下包含某文件名的所有File递归调
* 用listFile是个初始不为null,长度为0的list集合
* @param dir //某路径下
* @param prefix,查找文件名包含什么,你这里可以是包含.txt
* @param endStr后缀是什么
* @return
*/
public static List<File> listFile(String dir, String prefix,String endStr,List<File> listFile) {
try {
File file = new File(dir);
if (!file.isDirectory()) {
return listFile;
}
File[] files = file.listFiles();
for (int i = 0, len = files.length; i < len; i++) {
if (files[i].isDirectory()) {
listFile(files[i].getPath(), prefix,endStr, listFile);
} else {
if (files[i].getName().contains(prefix)) {
if(endStr==null){
listFile.add(files[i]);
}
if(endStr!=null && files[i].getName().endsWith(endStr)){
listFile.add(files[i]);
}
}
}
}
} catch (Exception e) {
Log.error(e.getMessage());
}
return listFile;
}
可以试着改成前缀是什么
你的情况如果把sum放置在类公共域中,就可以正常运行了,假如你想闭包不产生多余的外部变量,可以如下修改代码:
public static void eachFile(File src){
System.out.println(countTxt(src));
}
public static int countTxt(File src){
int count = 0;
if(src.isFile() && src.getName().endsWith(".txt")){
return ++count;
}
if(src.isDirectory()) {
File[] list = src.listFiles();
for(File element : list){
count += eachFile(element);
}
}
return count;
}
private static int sum;
public static void main(String[] args) throws IOException {
eachFile(new File("F:\testspace"));
System.out.println("文件的数量是"+sum);
}
public static void eachFile(File a) throws IOException{
File[] b= a.listFiles();
for (File file : b) {
if(!file.isDirectory()){
if (file.isFile()&&file.getName().endsWith(".txt")) {
System.out.println(file.getCanonicalPath());
sum++;
}
}else{
eachFile(file);
}
}
}