java IO (File类习题)
一、搜索功能
要求:
1、指定起始路径下包含指定词的所有文件
2、打印出全路径
- 例如:
- 目录结构如下:
- /user/a/a1.java
- /user/a/a2.java
- /user/java/j1.java
- /user/java/a.txt
- /user/java/b.mp4
- /user/file/java11.txt
- /user/file/.java34.txt
- 打印/user目录下含java的文件,搜索结果如下
- /user/a/a1.java
- /user/a/a2.java
- /user/java/j1.java
- /user/file/java11.txt
a因为在指定目录下搜索,所以肯定要用到循环,如果此路径下的是文件直接打印出绝对路径,然后如果当前路径是目录,则需要递归调用此搜索函数(先判断是否是文件,再判断是否是路径)
b既然要过滤关键字,就要用到FilenameFilter接口,重写accpt函数,把需要的文件过滤出来
c这里需要在for循环数组那里进行非空判断,如果是空会出现空指针异常
public static void seachFile(String path, String filter){
File file =new File(path );
if(!file .exists() ){//如果此路径不存在,直接返回
return ;
}
if(file .isFile() &&file .getName() .contains(filter ) ){//如果此路径就是文件,而且文件名字包含filter,直接输出路径
System.out.println(file .getAbsolutePath() );
return ;
}
if(file .isDirectory() ){//如果此路径是目录,则进入递归函数
seachFile(file ,filter );
}
}
public static void seachFile(File file, String filter){
FilenameFilter filenameFilter =new FilenameFilter() {//文件过滤器,过滤出是文件的file
@Override
public boolean accept(File dir, String name) {
File file1 =new File(dir ,name);
return file1 .isFile() ;
}
};
File []list=file .listFiles(filenameFilter );
if(list ==null){//避免出现NullPointError异常,(当前file没有文件时,数组为空)
return ;
}
for(int i=0;i<list .length ;i++){
File path=list [i];
if(path .getName() .contains(filter ) ){
System.out.println(path .getAbsolutePath() );
}
}
FilenameFilter direFilter=new FilenameFilter() {//文件过滤器 过滤出是目录的file
@Override
public boolean accept(File dir, String name) {
File file1 =new File(dir ,name );
return file1 .isDirectory() ;
}
};
File [] dire=file .listFiles(direFilter );
for(int i=0;i<dire .length ;i++){
File file1 =dire [i];
seachFile(file1 ,filter );//调用自己,继续找里面含filter的文件
}
}
二、树形打印
要求:
给定指定目录,将该目录下的文件按照树形结构打印出来
-一级目录
–二级目录
—三级目录
----四级目录
…
a这个题和级数有关,每升一级多打印一个“-”,如果第一次访问是文件打印“-”+path,访问的是目录打印“–”+path,这相当于给自己挖了一个坑,代码永远写不完,所以和上一题方法一样,用递归,层数和“-”的数量成正比,每次进来函数判断层数就可以,
b这道题只需要打印出全部文件就可以了,所以不需要文件搜索器
public static void PrintPath(String path,int fLevel){
File file = new File(path);
if(!file .exists() ) {//如果路径不存在,直接返回
return;
}
for(int i=0;i<fLevel ;i++){//判断层数
System.out.print("-");
}
if(file .isFile() ){//如果是文件直接输出文件名
System.out.println(file .getName() );
}
if(file .isDirectory() ){//如果是目录,调用自己
File []list=file .listFiles() ;
if(list ==null){//当当前file没有目录时,则数组为空
return ;
}
for(int i=0;i<list.length ;i++){
PrintPath(list [i].toString() ,fLevel +1) ;
}
}