Java的file

File

  • File 对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径
  • 这个路径可以是存在的,也允许是不存在的
方法名称 说明
public File(String pathname) 根据文件路径创建文件对象
public File(String parent, String child) 根据父路径名字符串和子路径名字符串创建文件对象
public File(File parent, String child) 根据父路径对应文件对象和子路径名字符串创建文件对象
package com.faxont.file;

import java.io.File;

public class FileDemo1 {
    public static void main(String[] args) {
        /*
            public File(String pathname)                    根据文件路径创建文件对象
            public File(String parent, String child)        根据父路径名字符串和子路径名字符串创建文件对象
            public File(File parent, String child)          根据父路径对应文件对象和子路径名字符串创建文件对象
         */

        // 1. 根据字符串表示的路径,变成 File 对象
        String filePath = "D:\\java\\workspace\\a.txt";
        File file1 = new File(filePath);
        System.out.println(file1);// D:\java\workspace\a.txt

        // 2. 根据父路径和子路径,变成 File 对象
        // 父级路径:D:\java\workspace
        // 子级路径:a.txt
        String fileParent = "D:\\java\\workspace";
        String fileChild = "a.txt";
        File file2 = new File(fileParent, fileChild);
        System.out.println(file2);// D:\java\workspace\a.txt

        // 3. 根据父路径对应的 File 对象和子路径,变成 File 对象
        File fileParent2 = new File("D:\\java\\workspace");
        File file3 = new File(fileParent2, fileChild);
        System.out.println(file3);// D:\java\workspace\a.txt

    }
}

File 的常见成员方法

判断、获取

方法名称 说明
public boolean isDirectory() 判断此路径名表示的 File 是否为文件夹
public boolean isFile() 判断此路径名表示的 File 是否为文件
public boolean exists() 判断此路径名表示的 File 是否存在
public long length() 返回文件的大小(字节数量)
public String getAbsolutePath() 返回文件的绝对路径
public String getPath() 返回定义文件时使用的路径
public String getName() 返回文件的名称,带后缀
public long lastModified() 返回文件的最后修改时间(时间毫秒值)
package com.faxont.file;

import java.io.File;

public class FileDemo2 {
    public static void main(String[] args) {
        /*
            public boolean isDirectory()        判断此路径名表示的 File 是否为文件夹
            public boolean isFile()             判断此路径名表示的 File 是否为文件
            public boolean exists()             判断此路径名表示的 File 是否存在
         */

        // 1. 对一个文件夹的路径进行判断
        File f1 = new File("D:\\Java\\workspace");
        System.out.println(f1.isDirectory());
        System.out.println(f1.isFile());
        System.out.println(f1.exists());
        System.out.println("-----------------------------");

        // 2. 对一个文件的路径进行判断
        File f2 = new File("D:\\Java\\hadoop\\test.txt");
        System.out.println(f2.isDirectory());
        System.out.println(f2.isFile());
        System.out.println(f2.exists());
        System.out.println("-----------------------------");

        // 3. 对一个不存在的路径进行判断
        File f3 = new File("D:\\Java\\test.txt");
        System.out.println(f3.isDirectory());
        System.out.println(f3.isFile());
        System.out.println(f3.exists());
    }
}
package com.faxont.file;

import java.io.File;
import java.text.SimpleDateFormat;

public class FileDemo3 {
    public static void main(String[] args) {
        /*
            public long length()                    返回文件的大小(字节数量)
            public String getAbsolutePath()         返回文件的绝对路径
            public String getPath()                 返回定义文件时使用的路径
            public String getName()                 返回文件的名称,带后缀
            public long lastModified()              返回文件的最后修改时间(时间毫秒值)
         */

        // 1. length 返回文件的大小(字节数量)
        // 细节1:这个方法只能获取文件的大小,单位是字节
        // 细节2:这个方法无法获取文件夹的大小
        // 如果我们要获取一个文件夹的大小,需要把这个文件夹里面所有的文件大小累加在一起
        File f1 = new File("D:\\java\\hadoop\\test.txt");
        System.out.println(f1.length());
        File f2 = new File("D:\\java\\hadoop");
        System.out.println(f2.length());
        System.out.println("-----------------------------");

        // 2. getAbsolutePath() 返回文件的绝对路径
        File f3 = new File("D:\\java\\hadoop\\test.txt");
        System.out.println(f3.getAbsolutePath());
        File f4 = new File("file\\a.txt");
        System.out.println(f4.getAbsolutePath());
        System.out.println("-----------------------------");

        // 3. getPath() 返回定义文件时使用过的路径
        File f5 = new File("D:\\java\\hadoop\\test.txt");
        System.out.println(f5.getPath());
        File f6 = new File("file\\a.txt");
        System.out.println(f6.getPath());
        System.out.println("-----------------------------");

        // 4. getName() 获取文件的名称,带后缀
        // 细节1:
        // a.txt    a 文件名   txt 后缀名、拓展名
        // 细节2:
        // 如果是文件夹,那么getName() 返回的就是文件夹的名称
        File f7 = new File("D:\\java\\hadoop\\test.txt");
        System.out.println(f7.getName());
        File f8 = new File("D:\\java\\hadoop");
        System.out.println(f8.getName());
        System.out.println("-----------------------------");

        // 5. lastModified() 返回文件的最后修改时间(时间毫秒值)
        File f9 = new File("D:\\java\\hadoop\\test.txt");
        System.out.println(f9.lastModified());
        File f10 = new File("file\\a.txt");
        System.out.println(f10.lastModified());

        // 将毫秒值转换为 日期 yyyy-MM-dd HH:mm:ss
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(f9.lastModified()));
        System.out.println(sdf.format(f10.lastModified()));


    }
}

创建、删除

方法名称 说明
public boolean createNewFile() 创建一个新的空文件
public boolean mkdir() 创建单级文件夹
public boolean mkdirs() 创建多级文件夹
public boolean delete() 删除文件、空文件夹

注意:delete 方法默认只能删除文件和空文件夹,delete 方法直接删除不走回收站

package com.faxont.file;

import java.io.File;
import java.io.IOException;

public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        /*
            public boolean createNewFile()      创建一个新的空文件
            public boolean mkdir()              创建单级文件夹
            public boolean mkdirs()             创建多级文件夹
            public boolean delete()             删除文件、空文件夹
         */

        // 1. 创建一个文件
        // 细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回 true
        //          如果当前路径表示的文件是存在的,则创建失败,方法返回 false
        // 细节2:如果父级路径是不存在的,那么方法会有异常
        // 细节3:createNewFile() 方法创建的一定是文件,如果路径中不包含后缀名,则返回一个没有后缀的文件
        File f1 = new File("D:\\Java\\workspace\\a.txt");
        System.out.println(f1.createNewFile());

        // 2. 创建单级文件夹
        // 细节1:Windows 当中路径是唯一的,如果当前路径已经存在,则创建失败,返回 false(例如,当前路径下有一个叫 test 的无后缀文件,我将无法再创建一个叫 test 的文件夹)
        // 细节2:mkdir 方法只能创建单级文件夹,无法创建多级文件夹
        File f2 = new File("D:\\Java\\workspace\\test");
        System.out.println(f2.mkdir());

        // 3. 创建多级文件夹
        // 细节:mkdirs 既可以创建单级文件夹,也可以创建多级文件夹
        File f3 = new File("D:\\Java\\workspace\\test\\a\\b\\c");
        System.out.println(f3.mkdirs());
    }
}
package com.faxont.file;

import java.io.File;

public class FileDemo5 {
    public static void main(String[] args) {
        /*
            public boolean delete()             删除文件、空文件夹
            细节:
                如果删除的是文件,则直接删除,不走回收站
                如果删除的是空文件夹,则直接删除,不走回收站
                如果删除的是非空文件夹,则不能删除,返回 false
         */

        // 1. 创建 File 对象
        File f1 = new File("D:\\java\\workspace\\a.txt");

        // 2. 删除
        boolean b = f1.delete();
        System.out.println(b);
    }
}

获取并遍历

方法名称 说明
public File[] listFiles() 获取当前该路径下所有内容

注意

  • 当调用者 File 表示的路径不存在时,返回 null
  • 当调用者 File 表示的路径是文件时,返回 null
  • 当调用者 File 表示的路径是一个空文件夹时,返回一个长度为0的数组
  • 当调用者 File 表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在 File 数组中返回
  • 当调用者 File 表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在 File 数组中返回,包含隐藏文件
  • 当调用者 File 表示的路径是需要权限才能访问的文件夹时,返回 null
package com.faxont.file;

import java.io.File;

public class FileDemo6 {
    public static void main(String[] args) {
        /*
            public File[] listFiles()       获取当前该路径下所有内容
         */

        // 1. 创建 File 对象
        File f1 = new File("D:\\java\\workspace");

        // 2. listFiles() 方法
        // 作用:获取当前路径下文件夹里的所有内容
        File[] files = f1.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }
}
方法名称 说明
public static File[] listRoots() 列出可用的文件系统根
public String[] list() 获取当前路径下所有内容
public String[] list(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容
public File[] listFiles() 获取当前该路径下所有内容
public File[] listFiles(FileFilter filter) 利用文件名过滤器获取当前该路径下所有内容
public File[] listFiles(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容
package com.faxont.file;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;

public class FileDemo7 {
    public static void main(String[] args) {
        /*
            public static File[] listRoots()                    列出可用的文件系统根
            public String[] list()                              获取当前路径下所有内容
            public String[] list(FilenameFilter filter)         利用文件名过滤器获取当前该路径下所有内容
            (掌握)public File[] listFiles()                           获取当前该路径下所有内容
            public File[] listFiles(FileFilter filter)          利用文件名过滤器获取当前该路径下所有内容
            public File[] listFiles(FilenameFilter filter)      利用文件名过滤器获取当前该路径下所有内容
         */

        // 1. listRoots 获取系统中所有的盘符
        File[] roots = File.listRoots();
        System.out.println(Arrays.toString(roots));

        // 2. list 获取当前路径下所有内容(仅能获取名字)
        File file = new File("D:\\java\\workspace");
        String[] names = file.list();
        for (String name : names) {
            System.out.println(name);
        }
        System.out.println("--------------------------------------------------------------------------------");

        // 3. list(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容
        // 需求:我现在要获取 D:\\java\\hadoop 文件夹里面所有的 txt 文件
        /**
         * accept 方法的形参,依次表示 hadoop 文件夹里面每一个文件或者文件夹路径
         * 参数一:父级路径
         * 参数二:子级路径
         * 返回值:如果返回值为 true,就表示当前路径保留
         *          如果返回值为 false,就表示当前路径舍弃不要
         */
        File file2 = new File("D:\\java\\hadoop");
        String[] list = file2.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir, name).isFile() && name.endsWith(".txt");
            }
        });
//        String[] list = file2.list((dir, name) -> new File(dir, name).isFile() && name.endsWith(".txt"));
        for (String name : list) {
            System.out.println(name);
        }
    }
}
package com.faxont.file;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;

public class FileDemo8 {
    public static void main(String[] args) {
        /*
            (掌握)public File[] listFiles()                           获取当前该路径下所有内容
            public File[] listFiles(FileFilter filter)          利用文件名过滤器获取当前该路径下所有内容
            public File[] listFiles(FilenameFilter filter)      利用文件名过滤器获取当前该路径下所有内容
         */

        // 1. 创建 File 对象
        File file = new File("D:\\java\\hadoop");

        // 2. 需求:打印里面所有的 txt 文件
        File[] files = file.listFiles();
        for (File f : files) {
            // f 表示 D:\\java\\hadoop 文件夹里面每一个文件或者文件夹的路径
            if (f.isFile() && f.getName().endsWith(".txt")) {
                System.out.println(f);
            }
        }
        System.out.println("--------------------------------------------------------------------------------");

        // FileFilter 和 FilenameFilter 的区别:
        // FileFilter 是文件过滤器,FilenameFilter 是文件名过滤器
        // 接收的参数不同
//        File[] listFiles = file.listFiles(new FileFilter() {
//            @Override
//            public boolean accept(File pathname) {
//                return pathname.isFile() && pathname.getName().endsWith(".txt");
//            }
//        });
        File[] listFiles = file.listFiles(pathname -> pathname.isFile() && pathname.getName().endsWith(".txt"));
        for (File f : listFiles) {
            System.out.println(f);
        }
        System.out.println("--------------------------------------------------------------------------------");

        // 与之前的区别:listFiles 方法返回值是一个数组,而 list 方法返回值是一个字符串数组
//        File[] listFiles2 = file.listFiles(new FilenameFilter() {
//            @Override
//            public boolean accept(File dir, String name) {
//                return new File(dir, name).isFile() && name.endsWith(".txt");
//            }
//        });
        File[] listFiles2 = file.listFiles((dir, name) -> new File(dir, name).isFile() && name.endsWith(".txt"));
        for (File f : listFiles2) {
            System.out.println(f);
        }

    }
}

综合练习

File 类相关的 API 练习题

练习1

需求:

​ 在当前模块下的 aaa 文件夹中创建一个 a.txt 文件

package com.faxont.test;

import java.io.File;
import java.io.IOException;

public class Test1 {
    public static void main(String[] args) throws IOException {
        /*
            在当前模块下的 aaa 文件夹中创建一个 a.txt 文件
         */

        // 1. 创建 a.txt 的父级路径
        File file = new File("file\\aaa");
        if (!file.exists()) {
            file.mkdir();
        }

        // 2. 拼接父级路径和子级路径
        File src = new File(file, "a.txt");
        boolean b = src.createNewFile();
        if(b){
            System.out.println("创建成功");
        }else{
            System.out.println("创建失败");
        }
    }
}

练习2

需求:

​ 定义一个方法,找某一个文件夹中是否有以sql结尾的文件(暂时不需要考虑子文件夹)

package com.faxont.test;

import java.io.File;

public class Test2 {
    public static void main(String[] args) {
        /*
            定义一个方法,找某一个文件夹中是否有以sql结尾的文件(暂时不需要考虑子文件夹)
         */

        // 1. 创建 File 对象
        File file = new File("D:\\java\\workspace");
        File file2 = new File("D:\\java");

        // 2. 调用方法
        System.out.println(findFile(file));
        System.out.println(findFile(file2));
    }

    public static boolean findFile(File file){
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile() && f.getName().endsWith(".sql")) {
                return true;
            }
        }
        return false;
    }
}

练习3

需求:

​ 定义一个方法,找某一个文件夹中是否有以sql结尾的文件(需要考虑子文件夹)

package com.faxont.test;

import java.io.File;

public class Test3 {
    public static void main(String[] args) {
        /*
            定义一个方法,找某一个文件夹中是否有以sql结尾的文件(需要考虑子文件夹)
         */

        // 1. 创建 File 对象
        File file = new File("D:\\java\\workspace");
        File file2 = new File("D:\\java");

        // 2. 调用方法
        System.out.println(findFile(file));
        System.out.println(findFile(file2));
    }

    public static boolean findFile(File file){
        File[] files = file.listFiles();
        if (files != null) {
            for (File f : files) {
                if (f.isFile() && f.getName().endsWith(".sql")) {
                    return true;
                }
                if (f.isDirectory()) {
                    boolean b = findFile(f);
                    if (b) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
}

练习4

需求:

​ 删除一个多级文件夹

package com.faxont.test;

import java.io.File;

public class Test4 {
    public static void main(String[] args) {
        /*
            删除一个多级文件夹
         */

        // 1. 创建 File 对象
        File file = new File("D:\\java\\workspace\\test\\a");

        // 2. 调用方法
        System.out.println(deleteDir(file));
    }

    public static boolean deleteDir(File dir){
        File[] files = dir.listFiles();
        for (File f : files) {
            if (f.isFile()) {
                boolean delete = f.delete();
                if (!delete) {
                    return false;
                }
            } else {
                boolean deleteDir = deleteDir(f);
                if (!deleteDir) {
                    return false;
                }
            }
        }
        return dir.delete();
    }
}

练习5

需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)

打印格式如下:

​ txt:3个

​ doc:4个

package com.faxont.test;

import java.io.File;
import java.util.HashMap;

public class Test5 {
    public static void main(String[] args) {
        /*
            需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
            打印格式如下:
            txt:3个
            doc:4个
         */

        // 1. 创建 File 对象
        File file = new File("D:\\java\\hadoop");

        // 2. 创建 HashMap 集合,用于存储文件类型和文件个数
        HashMap<String, Integer> map = new HashMap<>();

        // 3. 调用方法
        countFile(file, map);
        map.forEach((k, v) -> System.out.println(k + ":" + v + "个"));
    }

    public static void countFile(File file, HashMap<String, Integer> map){
        File[] files = file.listFiles();

        if(files == null || files.length == 0){
            throw new SecurityException(file + "是空文件夹");
        }

        for (File f : files) {
            if(f.isFile()){
                String name = f.getName();
                int index = name.lastIndexOf(".");
                if(index == -1 || index == name.length() - 1){
                    map.put("未知文件", map.getOrDefault("未知文件", 0) + 1);
                }else{
                    String type = name.substring(index + 1);
                    map.put(type, map.getOrDefault(type, 0) + 1);
                }
            }else{
                countFile(f, map);
            }
        }
    }
}

练习6

需求:统计一个文件夹的总大小

package com.faxont.test;

import java.io.File;

public class Test6 {
    public static void main(String[] args) {
        /*
            需求:统计一个文件夹的总大小
         */

        // 1. 创建 File 对象
        File file = new File("D:\\java\\hadoop");

        // 2. 调用方法
        System.out.println(getTotalSize(file));
    }

    public static long getTotalSize(File file){
        File[] files = file.listFiles();
        long size = 0;
        for (File f : files) {
            if(f.isFile()){
                size += f.length();
            }else{
                size += getTotalSize(f);
            }
        }
        return size;
    }
}
posted @ 2026-04-22 18:11  弋湖  阅读(5)  评论(0)    收藏  举报