1.删除方法delete 删除文件夹时 文件夹内不能有东西(必须为空) 文件可以直接删
那么如何删除由内容的文件夹呢?
public static void deleteFile(File file) {
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
if (file2.isFile()) {
file2.delete();
}else {
File[] listFiles2 = file2.listFiles();
deleteFile(file2);
}
}
file.delete();
}
2.获取文件的长度
获取的是文件的字节数 返回的是long型的返回值
File file1 = new File("/Users/Commander/Desktop/test/haha.txt");
//Mac下 一个英文字符一个字节 中文字符三个字节
long num = file1.length();
exercise:
计算文件夹的大小(包括内部文件的大小)
public static long getDirLength(File file) {
long sum = 0;
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
if (file2.isDirectory()) {
File[] listFiles2 = file2.listFiles();
getDirLength(file2);
sum = sum + getDirLength(file2);
}else {
sum = sum + file2.length();
}
}
return sum;
}
2.判断是不是文件夹 如果是就直接返回出来
public static File isDir() {
while (true) {
System.out.println("请输入一个文件夹路径");
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
File file = new File(string);
if (!file.exists()) {
System.out.println("该文件夹路径不存在,请重新输入");
}else if (file.isFile()) {
System.out.println("你输入的是文件,请重新输入");
}else {
return file;
}
}
}
输入一个文件夹路径 an层级关系打印
例如:
a
ooo.txt
ppp.txt
xy.txt
sss.txt
b
ooo.txt
pp.txt
xy.txt
// int level 表示第几层文件夹
public static void printf(File file, int level) {
// 循环出要打印的空格
String string = "";
for (int i = 0; i < level; i++) {
string = string + " ";
}
// 获取所有文件
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
if (!file2.isHidden()) {
System.out.println(string + file2.getName());
}
if (file2.isDirectory()) {
// 文件
printf(file2, level + 1);
}
}
}
调用此方法:
public static void main(String[] args) {
File file = new File("/Users/Commander/Desktop/test");
printf(file, 0);
}
输入一个文件夹路径 用map记录类型出现的次数
如:
txt 2
java 5
png 1
public static void getFileNumber(HashMap map, File file) {
File[] listFiles = file.listFiles();
Set keySet = map.keySet();
for (File file2 : listFiles) {
if (file2.isFile()) {
String string = file2.getName();
String[] split = string.split("\\.");
if (!keySet.contains(split[1])) {
map.put(split[1], 1);
} else {
Integer integer = map.get(split[1]);
integer = integer + 1;
map.put(split[1], integer);
}
} else {
getFileNumber(map, file2);
}
}
}
调用方法:
HashMap map = new HashMap<>();
File file = new File("/Users/Commander/Desktop/test");
getFileNumber(map, file);
System.out.println(map);
文件过滤器 FileFilter JDK1.2出来的
1.实现接口 及 方法创建一个FileFilter的实现类(重写accept方法):
class Test implements FileFilter{
/*
* 返回true的时候 会把所有文件装到数组中
* 返回false的时候 不会把所有文件装进数组里
* 该方法的参数 是文件夹中所有的文件路径
* 作用 : 过滤掉 你不需要的文件
* 获取文件夹中 所有txt文件
*/
@Override
public boolean accept(File f) {
//获取所有文件的绝对路径
//System.out.println(f);
//过滤文件夹(是文件夹 就返回false)
if (f.isDirectory()) {
return false;
}
return true;
}
}
在main函数中调用:
File file = new File("/Users/Commander/Desktop/test");
File[] listFiles = file.listFiles(new Test());
for (File file2 : listFiles) {
System.out.println(file2 + " enchanted");
}
exercise:利用过滤器过滤掉txt类型的文件
先写个FileFilter实现类来过滤txt文件:
class MyFilter implements FileFilter{
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()) {
//是文件夹 直接保存到数组中
return true;
}
//直接写 把文件夹的路径也过滤了
return pathname.getName().endsWith("txt");
}
}
再写个方法来查找所有文件:
public static void getTxt(File file) {
File[] listFiles = file.listFiles(new MyFilter());
for (File file2 : listFiles) {
if (file2.isDirectory()) {
getTxt(file2);
}else {
System.out.println(file2.getName());
}
}
}
调用方法并打印:
File file = new File("/Users/Commander/Desktop/test");
File[] listFiles = file.listFiles(new MyFilenameFilter());
for (File file2 : listFiles) {
System.out.println(file2);
}
文件过滤器 FilenameFileter JDK1.0出的
FileFilter相当于是对FilenameFileter接口的升级
直接使用FileFilter接口 不用再拼接文件了
class MyFilenameFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
//dir是文件夹父路径的文件
//name 是子路径(文件名) 是字符串
System.out.println(dir);
System.out.println(name);
return false;
}
}