递归就是自己调用自己的方法。实现像洋葱一样一层层往下,但是实际上只是不停重复剥这个动作,到剥完。
调用这个方法本身,所以叫递归啊
他这个只是打印文件,而不是目录。
if(file.isDirectory())//这个判断的是是不是目录,如果是就递归。把它下面的文件路径打印出来。 你如果要打印目录其实可以在递归前加上这段代码:System.out.print( file ); 他就会把目录也打印下来。
?
//空文件夹可以打出来 private void print(File dir){ if(dir==null){ System.out.println(dir + " is null"); } if(!dir.isDirectory()){ System.out.println(dir + " not is directory"); } File[] files = dir.listFiles(); if(files.length>0){ for(File file : files){ if(file.isDirectory()){ System.out.println(file.getParent() +"\\"+ file.getName()); print(file); }else{ System.out.println(file.getParent() +"\\"+ file.getName()); } } } }
静态方法可以直接调用
记住Argument 争论 然后眼熟这个异常
到需要用到时可以用alt+/ 补全 直接选这个
你传进去的参数是个txt文件不是个目录,即使调用了list方法 ,方法里files这个数组还是null,所以在判断files.length的时候会报异常,应该是这样吧
if
(dir.isDirectory()) {
//用于判断file类的对象是否是目录
throw
new
IllegalArgumentException(dir +
"不是目录"
);
}
判断里面应该是:不是文件夹的话就抛出异常,如果是就遍历文件,应该加!
listDirectory()throws IOException;
则try{
listDirectory()
}
catch(IOException e){
}
因为调用自己的时候(listDirector(file2);),listDirector()方法重新执行了一次:num重置为0,sum重新计数,System.out.println("一共:"+num+"个文件!")重新打印一次
FileUtils里面的listDirectory是静态方法,不需要实例化可以直接调用
System.out.println(A)你把这个加到if语句块里去。else语句是非空文件夹才会输出。仔细想想。
我觉得是在try里面调用成功的代码,在catch里面调用失败的代码。
files是返回的File类型数组,file是数组中的元素
需要先判断数组是否为空(files.length >0),而files != null只是更周全的写法,在这个示例里面其实是可以不用写的,因为上面已经判断了dir的存在
因为递归之后是有判断某个目录下的长度的,而当递归遍历到空文件夹时,它的长度为0,就不会执行for里面的语句了,就更无法执行for里面的打印语句了。
可以运行一下下面的代码,会每次递归都输出长度,容易理解
File[] filename=dir.listFiles();
//遍历该数组
//for (File string : filename) {
// System.out.println(string);
//}
//2、调用list()方法罗列文件
// String[] filename2=dir.list();
//for (String string : filename2) {
// System.out.println(string);
// }
//3、让它列出所有的内容
System.out.println(filename.length);
if(filename!=null&&filename.length>0) {
for (File file : filename) {
if(file.isDirectory()){
//递归
listDirectory(file);
System.out.println(file);
}else{
System.out.println(file);
}
}
直接打印file类型,是在内部tostring了,它本身是一个File对象,第一节讲File的时候说过了。你试试其他对象类型,打印出来的都是对象地址。
这个进入死循环了吧,dir参数调用的时候是你自己写的地址,他下次判断的时候不还是这个地址么,没有遍历的元素
utf-8
就是百分之千万的确定,files数组中是有东西的,避免程序异常。
file的length方法的作用:
如果File表示一个具体文件,则length方法返回这个文件的字节大小;
如果File表示一个目录,则length方法的返回值不确定;
如果File表示的目录或文件不存在,则length方法的返回值为0L。
你要是想获取某个目录下的子文件,是不能用length方法的,要用listFiles方法,用法如下:
File[] files = file.listFiles();
listFiles方法返回一个File数组,就是拿到的所有子文件(或目录)。
望采纳。
按照java的doc文档,
如果File表示一个具体文件,则length方法返回这个文件的字节大小;
如果File表示一个目录,则length方法的返回值不确定;
如果File表示的目录或文件不存在,则length方法的返回值为0L。
望采纳。
是File类中自带的
package com.xingzhuang;
import java.util.Scanner;
public class test1{
public static void main(String[]args){
char weekSecond;
Scanner input=new Scanner(System.in);
System.out.println("请输入第一个字母");
String letter=input.next();
if(letter.length()==1){
char weekFirst=letter.charAt(0);
switch(weekFirst){
case'm':
case'M':
System.out.println("星期一");
break;
case't':
case'T':
System.out.println("由于星期二和星期四都是T开头,请继续输入第二个字母");
letter=input.next();
if(letter.length()==1){
weekSecond=letter.charAt(0);
if(weekSecond=='U'||weekSecond=='u'){
System.out.println("星期二");
break;
}else if(weekSecond=='H'||weekSecond=='h'){
System.out.println("星期四");
break;
}else{ //这里的else有错,不懂
System.out.println("输入第二个错误,请重新输入");
break;
}
} else{ //这里的else有错,不懂
System.out.println("输入超过一个字母,请重新输入");
break;
}
case'w':
case'W':
System.out.println("星期三");
break;
case'f':
case'F':
System.out.println("星期五");
break;
case's':
case'S':
System.out.println("星期六和星期天都是s开头,需要输入第二个字母");
letter=input.next();
if(letter.length()==1){
weekSecond=letter.charAt(0);
if(weekSecond=='A'||weekSecond=='a'){
System.out.println("星期六");
break;
}
else if(weekSecond=='U'||weekSecond=='u'){
System.out.println("星期天");
break;
}else{
System.out.println("输入错误,请重新输入");
}
}else{ //这里的else有错,不懂
System.out.println("输入超过一个字母,请重新输入");
break;
}
default:
System.out.println("默认输出,无法识别,请重新输入");
break;
}
}else{
System.out.println("最后输入错误,只能输入一个字母,请重新输入");
}
}
}
贴代码
参数类型是File,直接写说白了就是个字符串,你拿String类型的东西如何能当做到File类型的参数传呢?
不是实现重新判断if语句的作用!视频中已经提到了那是递归。什么是递归呢?简单一点说就是自身调用自身的一种形式。在listDirectory(File dir)方法中已经有了查看当前目录下的内容,当想要查看其子目录下的内容时所用到的方法(手段)与listDirectory(File dir)方法中查看当前目录下的内容的方法(手段)一致,那么就没必要在写一个方法,所用就直接调用listDirectory(File dir)。
第一个是抛出异常,当前方法内不处理。第二个是捕获异常,即处理异常
空文件只能遍历文件名
反斜杠/是可以运行的。但是你怎么把冒号写成分号了!
静态方法的使用。
调用静态方法,直接类名.方法名就可以了
基础不牢哦