File
File对象既可以表示文件,也可以表示目录。
列出目录下的文件和子目录名
Flle[] listFiles()
Flle[] listFiles(FileFilter filter)
Flle[] listFiles(FilenameFileter filter)
创建和删除目录
boolean mkdir() 创建当前File对象表示的目录;
boolean mkdirs() 创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来;
boolean delete() 删除当前File对象表示的目录,当前目录必须为空才能删除成功。
文件过滤
不使用java文件过滤器过滤文件示列:
public static void filter(File file, String filetype) {
for (File f : file.listFiles()) {
if (f.getName().endsWith(filetype)) {
System.out.println(f.getPath());
}
}
}
java提供了文件过滤类FileFileter 和FilenameFileter可直接过滤文件,需要重写accept()方法
accept()方法返回的是一个布尔值:
- true:将传递过去的File对象保存到File数组中(放行)
- false:不将传递过去的File对象保存到File数组中
示列 过滤当前目录下某一类型文件:
File f = new File("C:\\windows");
//FileFilter
File[] files1 = f.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith("exe");
}
});
System.out.println("FileFilter-----------"+files1.length);
for (File ff : files1) {
System.out.println(ff);
}
//FilenameFilter
File[] files2 = f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith("exe");
}
});
System.out.println("FilenameFilter----------"+files2.length);
for(File ff : files2 ){
System.out.println(ff);
}
以上只能遍历循环当前目录下的直接子目录,若想遍历当前目录所有的目录需要递归调用
示列:
/**
* 获取当前目录内包含所有的文件夹
* @param file
*/
public static void findAllDir(File file) {
File[] f = file.listFiles();
if (f != null) {
for (File ff : f) {
if (ff.isDirectory()) {
System.out.println(ff.getPath());
findAllDir(ff);
}
}
}
}
static LinkedList<File> list = new LinkedList<>();
/**查找包括当前目录内所有指定类型的文件
* @param file 从哪个目录内遍历
* @param fileType 文件类型
*/
public static LinkedList<File> findAllFileInDir(File file, String fileType) {
File[] fs = file.listFiles();
if (fs != null) {
for (File f : fs) {
if (f.isDirectory()) {
findAllFileInDir(f, fileType);
}
if (f.isFile() && f.getName().endsWith(fileType)) {
filecount++;
System.out.println(String.format("%d\t%.2f MB\t%s",filecount,getFileSize(f),f));
list.add(f);
}
}
}
return list;
}
获取文件大小示例:
/**
* 获取文件大小
* @param f
* @return
*/
public static double getFileSize(File f) {
if (f.isFile()) {
double size = f.length() / (Math.pow(1024, 2));
return size;
}
return -1;
}
排序当前目录下所有指定类型的文件:
//先定义TreeSet怎样排序,需要重写compare()方法
public static TreeSet<File> ts = new TreeSet<>(new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
double i = getFileSize(o1)-getFileSize(o2);
int ii = i>=0? 1:-1;
return -ii;
}
});
/**
* 排序当前目录下所有指定类型的文件
* @param f
* @param fileType
* @return
*/
public static TreeSet<File> sortAllFile(File f, String fileType) {
LinkedList<File> allFileInDir = findAllFileInDir(f, fileType); //使用之前写好的查找方法
System.out.println("共查找到"+allFileInDir.size()+"个文件");
ts.addAll(allFileInDir);
for (File ff : ts) {
filecount++;
System.out.println(String.format("%d\t%.2f MB \t\t%s",filecount,getFileSize(ff),ff.getName()));
}
return ts;
}