zoukankan      html  css  js  c++  java
  • Java.io.File类对文件的目录、基本操作、递归、遍历

    创建和删除

    //创建文件
    File file1 = new File("不存在的文件.txt");//注意,这一步并没有创建文件,只是把磁盘中的文件封装成了一个对象
    System.out.println(file1.exists() + "--" + file1.createNewFile());//false--true。这一步是将File对象写入到磁盘中的文件中。如果文件不存在,则创建
    System.out.println(file1.exists() + "--" + file1.createNewFile() + "
    ");//true--false。如果文件已存在,则不创建
    //创建目录
    File dir1 = new File("e:/a/aa");
    File dir2 = new File("e:/a/bb");
    System.out.println(dir1.exists() + "--" + dir1.mkdir());//false--false。mkdir只能创建最后一级目录,若父目录不存在则最后一级肯定创建失败,但不报异常
    System.out.println(dir2.exists() + "--" + dir2.mkdirs());//false--true。mkdirs可以同时创建多级目录,我们一般直接用它就行了
    System.out.println(dir1.exists() + "--" + dir1.mkdir());//false--true
    //创建带目录的文件
    //System.out.println(new File("e:/a/demo.txt").createNewFile());//一定要注意:createNewFile只能创建文件,不能创建目录;如果目录不存在,会报异常
    File dirPath = new File("e:/不存在的目录/b");
    if (!dirPath.exists()) dirPath.mkdirs();//如果目录不存在则先创建目录
    File file = new File(dirPath, "demo.txt");//再在此目录中创建文件
    System.out.println("创建带目录的文件:" + file.createNewFile() + "
    ");//true
    //删除文件和目录
    System.out.println(dirPath.list().length);//获取指定目录下的文件名称列表,包含目录文件,但不包含目录文件中的文件。1
    System.out.println(dirPath.delete());//如果目录中有文件,则删除失败。false
    System.out.println(file.delete() + "--" + dirPath.delete());//true--true
    System.out.println(dirPath.exists() + "--" + new File("e:/不存在的目录").exists());//false--true。注意:仅仅是删掉了最里层的目录,而其父目录并没有删除
    

    get和判断

    public static void main(String[] args) throws IOException {
        File file1 = new File("a.txt");
        System.out.println(file1.length());//0
        System.out.println(file1.getName());//a.txt
        System.out.println(file1.getPath());//a.txt
        System.out.println(file1.getAbsolutePath());//绝对路径,D:workspace_bqtJAVAa.txt
        System.out.println(file1.getParent() + "
    ");//null。注意,这里仅指[相对路径]中的父路径,如果此路径名没有指定父目录,则返回 null
        File file2 = new File("e:\demo.java");
        System.out.println(file2.length());//195
        System.out.println(file2.getName());//demo.java
        System.out.println(file2.getPath());//注意并不是仅指最后一级目录,而是指 new File() 时传进去的路径。e:demo.java
        System.out.println(file2.getAbsolutePath());//绝对路径,e:demo.java
        System.out.println(file2.getParent() + "
    ");//e:
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
        System.out.println(dateFormat.format(new Date(file2.lastModified())) + "
    ");//2016年5月20日 下午04时54分00秒
        System.out.println(file1.exists() + "--" + file1.createNewFile() + "--" + file1.exists());//false--true--true
        System.out.println(file1.isFile() + "--" + file1.isDirectory());//true--false
        System.out.println("重命名:" + file1.renameTo(new File("e:/demo3.txt")));//重命名时须指定重命名后存放的路径,否则会移动到默认路径
        file1 = new File("e:/aa\bbb");
        System.out.println(file1.mkdirs() + "--" + file1.isFile() + "--" + file1.isDirectory());//true--false--true
    }
    

    目录相关操作

    public class Test {
        public static void main(String[] args) throws IOException {
            System.out.println("*********************************************************************************获取系统【根目录】名称列表");
            File[] fileRoots = File.listRoots();
            System.out.println(Arrays.toString(fileRoots));//[C:\, D:\, E:]
            System.out.println("*********************************************************************************获取某一【磁盘】的容量信息");
            File myFile = new File("e:/");//注意,只能获取整个磁盘的容量,而不能获取此磁盘子目录的容量,子目录的容量只能通过计算得到
            System.out.println(formatDataSize(myFile.getFreeSpace()));//248.45GB
            System.out.println(formatDataSize(myFile.getTotalSpace()));//285.74GB
            System.out.println(formatDataSize(myFile.getUsableSpace()));//248.45GB
            System.out.println("***************************************************************************获取指定目录下的【文件名称列表】");
            //如果目录存在但是没有内容,会返回一个长度为0的数组;如果目录不存在或目录其实是一个文件,返回null
            String[] fileNames = myFile.list();//包含所有文件夹以及隐藏文件
            System.out.println(fileNames.length);
            System.out.println("****************************************************************获取指定目录下后缀名为.txt的【文件名称列表】");
            String[] fileNames2 = myFile.list(new MyFilenameFilter(".txt", 0));//不包含子目录中的文件,如果需要,请使用递归深度遍历
            for (String name : fileNames2) {
                System.out.println(name);//string.txt
            }
            System.out.println("******************************************************获取指定目录下大于100Kb、后缀名为.mp3的【文件列表】");
            File[] files = myFile.listFiles(new MyFilenameFilter(".mp3", 1024 * 100));
            for (File f : files) {
                System.out.println(f);//e:Tfboys - 大梦想家.mp3
            }
        }
        /** 
           * 格式化硬盘容量
           * 注意1024默认是【int】类型的,2^32=(2^2)*(2^30)=4*(1024^3),所以int类型能表示的数最大为4G,所以绝对不能用int表示1024^4
           */
        public static String formatDataSize(long size) {
            DecimalFormat formater = new DecimalFormat("####.00");
            if (size < 1024) return size + "bytes";
            else if (size < Math.pow(1024, 2)) return formater.format(size * Math.pow(1024, -1)) + "KB";
            else if (size < Math.pow(1024, 3)) return formater.format(size * Math.pow(1024, -2)) + "MB";
            else if (size < Math.pow(1024, 4)) return formater.format(size * Math.pow(1024, -3)) + "GB";
            else if (size < Math.pow(1024, 5)) return formater.format(size * Math.pow(1024, -4)) + "TB";
            else return "啥玩意啊,有这么大的硬盘吗?";
        }
        //******************************************************************************************
        //                                                                                检索规则
        //******************************************************************************************
        public static class MyFilenameFilter implements FilenameFilter {
            private String type;
            private long size;
            /**
             * 检索规则
             * @param type    指定后缀名的文件
             * @param size     不小于指定大小的文件,单位:字节
             */
            public MyFilenameFilter(String type, long size) {
                this.type = type;
                this.size = size;
            }
            public boolean accept(File dir, String name) {
                long fileSize = new File(dir, name).length();
                //System.out.println("检索过程:" + dir.getAbsolutePath() + "--" + name + "--" + fileSize);
                return fileSize >= size && name.endsWith(type);
            }
        }
    }
    

     获取指定目录下的全部文件

    public static void main(String[] args) {
        List<String> filesNames = new ArrayList<String>();
        getDirFilesNames("E:/KuGou", filesNames, null);
        List<File> files = new ArrayList<File>();
        getDirFiles("E:/baiqiantao/doudou/src", null, true, files);
        for (String name : filesNames) {
            System.out.println(name);
        }
        for (File file : files) {
            System.out.println(file.getName() + "--" + file.length());
        }
    }
    /**
     * 对指定目录中的文件进行深度遍历,并按照指定过滤器进行过滤,将过滤后的内容存储到一个指定的集合中
     * @param dirPath    要遍历的目录,必须是一个目录
     * @param filter    只遍历目录中的指定类型的文件,如果要遍历所有文件请设为null
     * @param isContainDir    是否包含目录文件
     * @param fileList  将结果保存到指定的集合中。由于要递归遍历(不能定义为局部变量,否则每次递归时都是把结果放到了一个新的集合中) ;
     *                                  并且是静态方法(定义为静态成员时,下次调用此方法时此集合还包含之前调用后保存的值),所以最后保存到指定的集合中
     * @return    遍历到的文件数量,也即集合的大小
     */
    public static int getDirFiles(String dirPath, FilenameFilter filter, boolean isContainDir, List<File> fileList) {
        File dir = new File(dirPath);
        if (!dir.exists() || !dir.isDirectory()) throw new RuntimeException("目录不存在或不是一个目录");
        if (fileList == null) throw new RuntimeException("指定的集合不存在");
        File[] files = dir.listFiles();//也可以使用dir.listFiles(filter)在获取列表时直接过滤,注意这种方式检索时不要遗漏了目录文件
        for (File file : files) {//遍历
            if (file.isDirectory()) {//目录
                if (isContainDir) {//返回集合中是否要包含目录
                    fileList.add(file);
                }
                getDirFiles(file.getAbsolutePath(), filter, isContainDir, fileList);//递归
            } else {//文件
                if (filter == null || filter.accept(dir, file.getName())) {//是否满足过滤规则
                    fileList.add(file);
                }
            }
        }
        return fileList.size();
    }
    /**
       * 获取指定目录及其子目录下的指定格式文件的文件名,并对文件名进行格式化,并存储到一个指定的集合中
       * @param dirPath    要遍历的目录,必须是一个目录
       * @param filter  只遍历目录中的指定类型文件,如果要遍历所有文件请设为null
       * @param filePathList   将结果保存到指定的集合中。由于要递归遍历(不能定义为局部变量,否则每次递归时都是把结果放到了一个新的集合中); 
       *                                  并且是静态方法(定义为静态成员时,下次调用此方法时此集合还包含之前调用后保存的值),所以最后保存到指定的集合中
       * @return    遍历到的文件数量,也即集合的大小
       */
    public static int getDirFilesNames(String dirPath, List<String> filePathList, FilenameFilter filter) {
        return getDirFormatFilesNames(dirPath, filePathList, filter, true, true, true, 0, 0);
    }
    /**
     * 获取指定目录及其子目录下的指定格式文件的文件名,并对文件名进行格式化,并存储到一个指定的集合中
     * @param dirPath    要遍历的目录,必须是一个目录
     * @param filePathList   将结果保存到指定的集合中
     * @param filter 只遍历目录中的指定类型文件,如果要遍历所有文件请设为null
     * @param isContainDir    是否包含目录文件
     * @param isFormat    是否格式化文件名
     * @param isShowNum    是否显示编号;isFormat=true时才有效
     * @param maxLeval 要遍历的最大层级(多少层目录),0代表遍历到最后一层;isFormat=true时才有效
     * @param currentLvel    递归调用时结束标记,请直接设为0;isFormat=true时才有效
     * @return    遍历到的文件数量,也即集合的大小
     */
    private static int getDirFormatFilesNames(String dirPath, List<String> filePathList, FilenameFilter filter, boolean isContainDir, boolean isFormat,
            boolean isShowNum, int maxLeval, int currentLvel) {
        File dir = new File(dirPath);
        if (!dir.exists() || !dir.isDirectory()) throw new RuntimeException("目录不存在或不是一个目录");
        if (filePathList == null) throw new RuntimeException("指定的集合不存在");
        if (0 == maxLeval || currentLvel < maxLeval) {
            currentLvel++;
            File[] files = dir.listFiles();
            String filePath;
            for (int x = 0; x < files.length; x++) {
                if (isFormat) {
                    if (isShowNum) filePath = getSpace(currentLvel) + currentLvel + "." + (x + 1) + ".  " + files[x].getAbsolutePath();
                    else filePath = getSpace(currentLvel) + files[x].getAbsolutePath();
                } else {
                    filePath = files[x].getAbsolutePath();
                }
                if (files[x].isDirectory()) {//如果是目录
                    if (isContainDir) {
                        if (isFormat) {
                            filePath = filePath + "		★★★★★ 目录 ★★★★★";
                        }
                        filePathList.add(filePath);
                    }
                    getDirFormatFilesNames(files[x].getAbsolutePath(), filePathList, filter, isContainDir, isFormat, isShowNum, maxLeval, currentLvel);//递归
                } else { //如果是文件
                    if (filter == null || filter.accept(dir, files[x].getName())) {//是否满足过滤规则
                        filePathList.add(filePath);
                    }
                }
            }
        }
        return filePathList.size();
    }
    /***
     * 格式化目录
     * @param level    目录层次,也即"| _ _"的个数
     */
    private static String getSpace(int level) {
        StringBuilder sb = new StringBuilder();
        for (int x = 0; x < level; x++) {
            sb.append("| _ _ ");
        }
        return sb.toString();
    }
    

     删除指定目录下的全部文件

    /**
     * 删除一个带内容的目录。必须从里面往外删。
     * @param dirPath 要删除的目录,可以是文件。文件不存在时调用delete()方法不会报异常,但是返回false
     * @param isDeleateDir 是否删除目录
     */
    public static void deleateDirFiles(String dirPath, boolean isDeleateDir) {
        File dir = new File(dirPath);
        if (dir.isDirectory()) {
            File[] files = dir.listFiles();//如果dir是文件的话,dir.listFiles()返回空
            for (File file : files) {
                if (file.isDirectory()) {
                    deleateDirFiles(file.getAbsolutePath(), isDeleateDir);//递归
                } else {
                    System.out.println("文件【" + file + "】删除结果:" + file.delete());
                }
            }
            System.out.println("        ★★★★★ 目录【" + dir.getAbsolutePath() + "】中的文件已全部删除");
            if (isDeleateDir) {
                System.out.println("        ★★★★★ 目录【" + dir + "】删除结果:" + dir.delete());//删除所有内部文件后再删除目录
            }
        } else {
            System.out.println("删除结果:" + dir.delete());
        }
    }
    
  • 相关阅读:
    HttpInvoker-----服务端实现
    RMI实现-----客户端的实现
    RMI实现-----服务端的实现
    远程服务(RMI)使用示例
    DispatcherServlet的逻辑处理(下篇)
    DispatcherServlet的逻辑处理(上篇)
    SpringMVC-----DispatcherServlet
    SpringMVC-----ContextLoaderListener
    爬取淘宝笔记本电脑数据(一)
    哔哩哔哩自动播放视频
  • 原文地址:https://www.cnblogs.com/47Gamer/p/13224455.html
Copyright © 2011-2022 走看看