挑战任务
本关任务:小明想要开发一个图片查看器,但是他想只显示文件夹下所有图片类型的文件。
你来帮小明实现这个功能吧。
相关知识
文件过滤器
要从列表中排除扩展名为.SYS
的所有文件,我们可以使用由功能接口FileFilter
的实例表示的文件过滤器来实现。
它包含一个accept()
方法,它将File
作为参数列出,如果应该列出文件,则返回true
。返回false
不会列出文件。
以下代码创建一个文件过滤器,将过滤扩展名为.SYS
的文件。
FileFilter filter = file -> {
if (file.isFile()) {
String fileName = file.getName().toLowerCase();
if (fileName.endsWith(".sys")) {
return false;
}
}
return true;
};
下列代码展示如何使用一个过滤器:
import java.io.File;
import java.io.FileFilter;
public class Main {
public static void main(String[] args) {
String dirPath = "C:\\";
File dir = new File(dirPath);
// Create a file filter to exclude any .SYS file
FileFilter filter = file -> {
if (file.isFile()) {
String fileName = file.getName().toLowerCase();
if (fileName.endsWith(".sys")) {
return false;
}
}
return true;
};
File[] list = dir.listFiles(filter);
for (File f : list) {
if (f.isFile()) {
System.out.println(f.getPath() + " (File)");
} else if (f.isDirectory()) {
System.out.println(f.getPath() + " (Directory)");
}
}
}
}
文件目录:
过滤后打印的文件目录:
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充,具体任务如下:
- 实现对给定文件夹目录结构的展示,并以文件名按升序排序的形式打印至控制台。如果是文件夹则在其名字之前加上
+--
,若是文件则加上--
,上级目录与下级目录、下级文件用两个空格作为间隔,另外需要对文件进行过滤,只显示图片类型的文件,本关需要过滤的图片文件类型有:“jpg,png,bmp”
,请补充完善右侧代码区中的showDirStructure(File file)
函数实现本关要求的功能,其中函数参数含义如下:
1). file
:指定要显示的文件夹。
测试说明
样例1
输入:src/step4/root
输出:
样例2
输入:src/step4/dir
输出:
提示:
你可以通过如下链接下载本关涉及到的目录文件: https://data.educoder.net/attachments/download/202620/step3Dir.zip
package step4;
import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
public class Task {
/********** Begin **********/
String dir ="+--";
String wj = "--";
String level = "";
public void showDirStructure(File file) {
//判断是否是文件夹
if(file.isDirectory()){
System.out.println(level+dir+file.getName());
String level1=level;
level+=" ";
File[] files = file.listFiles();
Arrays.sort(files);
for (File file1 : files) {
showDirStructure(file1);
}
level=level1;
}else{
//如果是文件,则筛选
String name = file.getName();
if(name.endsWith("jpg")||name.endsWith("bmp")||name.endsWith("png"))
System.out.println(level+wj+name);
}
}
/********** End **********/
}