Java基础(下)之File文件
File
- File对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径
- 这个路径可以是存在的,也允许是不存在的
构造方法

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);
}
}
常用成员方法
判断获取类

注意:
- 若路径不存在,则isFile和isDirectory均为false,与路径本身无关
- 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));
}
}
创建删除类

注意:
- createNewFile方法,若上级路径不存在,会出现IOException异常;创建的一定是文件,与后缀名无关
- delete方法默认只能删除文件和空文件夹,若该目录中存在子目录(尽管没有文件),也会删除失败;
- 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
}
获取与遍历


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"));
}
}
练习
- 查找目录中的文件(考虑多级目录)
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;
}
}
- 删除一个多级目录
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();//删除该空目录
}
}
- 获取多级目录中所有文件的大小
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;
}
- 获取并输出多级目录中各类文件的个数
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;
}

浙公网安备 33010602011771号