Java基础(下)之File文件

File

  • File对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径
  • 这个路径可以是存在的,也允许是不存在的

构造方法

image

class Main {
    public void main(String[] args) throws Exception{
        String path = "D:\\Java_Study\\demo1\\a.txt";
        File f1 = new File(path);
        System.out.println(f1);

        String dir = "D:\\Java_Study\\demo1",filename = "a.txt";
        File f2 = new File(dir,filename);
        System.out.println(f2.toString());

        File f3 = new File(new File(dir),filename);
        System.out.println(f3);
    }
}

常用成员方法

判断获取类

image
注意:

  1. 若路径不存在,则isFile和isDirectory均为false,与路径本身无关
  2. length方法不能用于表示目录的路径,对于目录或不存在的路径返回0
class Main {
    public void main(String[] args) throws Exception{
        String path1 = "D:\\Java_Study\\demo1\\data\\aaa\\a.txt";
        File f1 = new File(path1);
        System.out.println(f1);
        System.out.println(f1.isFile());
        System.out.println(f1.isDirectory());
        System.out.println(f1.length());

        String path2 = "D:\\Java_Study\\demo1\\data\\";
        File f2 = new File(path2);
        System.out.println(f2);
        System.out.println(f2.isFile());
        System.out.println(f2.isDirectory());
        System.out.println(f2.length());//Windows11输出0

        String path3 = "data\\aaa\\a.txt";
        File f3 = new File(path3);
        System.out.println(f3);
        System.out.println(f3.getAbsoluteFile());// D:\Java_Study\demo1\data\aaa\bbbb\a.txt
        System.out.println(f3.getPath());// data\aaa\bbbb\a.txt
        System.out.println(f3.getName());// a.txt
        System.out.println(f3.getParent());// data\aaa\bbbb
        long time = f3.lastModified();//返回的是表示日期时间的毫秒值
        System.out.println(time);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//创建对应格式的日期时间对象
        System.out.println(sdf.format(time));
    }
}

创建删除类

image
注意:

  1. createNewFile方法,若上级路径不存在,会出现IOException异常;创建的一定是文件,与后缀名无关
  2. delete方法默认只能删除文件和空文件夹,若该目录中存在子目录(尽管没有文件),也会删除失败;
  3. mkdir方法仅可创建单级目录,若存在同名的文件,则创建失败
public void main(String[] args) throws IOException {
        File f1 = new File("D:\\Java_Study\\demo1\\data\\aaa\\a.txt");
        System.out.println(f1.createNewFile());
        System.out.println(f1.createNewFile());//文件已存在,则返回false
        File f2 = new File("D:\\Java_Study\\demo1\\data\\aaa\\bbb\\b.txt");
        System.out.println(f2.createNewFile());//若上级路径不存在,会出现IOException异常
        File f3 = new File("D:\\Java_Study\\demo1\\data\\aaa\\c");
        System.out.println(f3.createNewFile());//createNewFile创建的一定是文件,与后缀名无关

        File f4 = new File("D:\\Java_Study\\demo1\\data\\aaa\\c");
        System.out.println(f4.mkdir());//存在同名的文件,则创建失败,返回false

        File f5 = new File("D:\\Java_Study\\demo1\\data\\aaa\\bbb\\ccc");
        System.out.println(f5.mkdir());//仅可创建单级目录,返回false,可用mkdirs创建多级目录
        System.out.println(f5.mkdirs());

        System.out.println(f1.delete());
        System.out.println(f1.delete());//文件不存在,返回false
        System.out.println(new File(f5.getParent()).delete());//仅可删除空目录,该目录中存在子目录(尽管没有文件),返回false

}

获取与遍历

image
image

class Main {
    public void main(String[] args) throws IOException {
        File[] arr = File.listRoots();//获取系统中所有的盘符
        System.out.println(Arrays.toString(arr));

        File f1 = new File("D:\\Java_Study\\demo1\\data\\aaa");
        String[] arr1 = f1.list();
        System.out.println(Arrays.toString(arr1));

        //找出目录中所有txt文件名
        String[] arr2 = f1.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir, name).isFile() && name.endsWith(".txt");
            }
        });
        System.out.println(Arrays.toString(arr2));

        File[] arr3 = f1.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isFile() && pathname.getName().endsWith(".txt");
            }
        });
        System.out.println(Arrays.toString(arr3));

        File[] arr4 = f1.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir, name).isFile() && name.endsWith(".txt");
            }
        });
        System.out.println(Arrays.toString(arr4));
        File[] arr5 = f1.listFiles((dir,name)->new File(dir, name).isFile() && name.endsWith(".txt"));
    }
}

练习

  1. 查找目录中的文件(考虑多级目录)
class Main {
    public void main(String[] args) throws IOException {
        File dir = new File("data");
        List<File>list = searchFiles(dir,".avi");
        for(File f:list){
            System.out.println(f.getAbsolutePath());
        }
    }

    List<File> searchFiles(File path,String suffix){
        List<File> list = new ArrayList<>();
        if(path.isFile()){
            if(path.getName().endsWith(suffix)){
                list.add(path);
            }
            return list;
        }

        for(File file:path.listFiles()){
            List<File>tmp = searchFiles(file,suffix);
            list.addAll(tmp);
        }
        return list;
    }
}
  1. 删除一个多级目录
class Main {
    public void main(String[] args) throws IOException {
        File dir = new File("data1");
        System.out.println(DeleteDir(dir));
    }

    boolean DeleteDir(File dir){
        if(!dir.exists()){
            return false;
        }
        if(dir.isFile()){
            return dir.delete();
        }
        for(File f:dir.listFiles()){
            if(f.isFile()){
                if(!f.delete()) return false;
            }else{
                if(!DeleteDir(f)) return false;
            }
        }
        return dir.delete();//删除该空目录
    }
}
  1. 获取多级目录中所有文件的大小
long get_dir_size(File path){
	if(!path.exists()) return 0;
	if(path.isFile()) return path.length();
	long sum = 0;
	for(File f:path.listFiles()){
		if(f.isFile()){
			sum += f.length();
		}else{
			sum += get_dir_size(f);
		}
	}
	return sum;
}
  1. 获取并输出多级目录中各类文件的个数
HashMap<String,Integer> get_sum(File path){
	if(!path.exists()){
		return new HashMap<>();
	}
	HashMap<String,Integer>mp = new HashMap<>();
	if(path.isFile()){
		String[] split = path.getName().split("\\.");
		String suffix = split[split.length - 1];
		mp.put(suffix,1);
		return mp;
	}

	for(File f:path.listFiles()){
		if(f.isFile()){
			String[] split = f.getName().split("\\.");
			String suffix = split[split.length - 1];
			if(mp.containsKey(suffix)){
				mp.replace(suffix,mp.get(suffix) + 1);
			}else{
				mp.put(suffix,1);
			}

		}else{
			HashMap<String,Integer>son_mp = get_sum(f);
			for(Map.Entry<String,Integer>pair:son_mp.entrySet()){
				String key = pair.getKey();
				if(mp.containsKey(key)){
					mp.replace(key,mp.get(key) + pair.getValue());
				}else{
					mp.put(key,pair.getValue());
				}
			}
		}
	}
	return mp;
}
posted @ 2026-02-25 16:47  安河桥北i  阅读(1)  评论(0)    收藏  举报