zoukankan      html  css  js  c++  java
  • Java之File与递归

    File类的使用和递归思想

    File类

    概述

    文件: 存储数据

    文件夹: 管理文件与文件夹

    构造方法

    • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
    • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
    • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

    常用方法

    创建方法

    • public boolean createNewFile() : 创建文件,存在返回false,不存在创建文件返回true
    • boolean mkdir() : 创建文件夹,存在返回false,不存在创建文件夹返回true
    • boolean mkdirs() : 创建多级文件夹,存在返回false,不存在创建多级文件夹返回true

    删除方法

    • boolean delete() : 删除文件或者文件夹,文件存在返回true,文件不存在返回false;
      可以删除空的文件夹,如果文件夹下有子文件或者子文件夹,删除不掉

    判断方法

    • public boolean exists() :此File表示的文件或目录是否实际存在。
    • public boolean isDirectory() :此File表示的是否为目录(文件夹)。
    • public boolean isFile() :此File表示的是否为文件。

    路径问题

    绝对路径 : 以盘符开头
    相对路径 : 相对于本项目

    • public String getAbsolutePath() :返回此File的绝对路径名字符串。
    • public String getParent() : 获取父路径,在创建对象时制定了父路径才能获取,没有指定返回null(相对路径返回null).
    • public String getPath() :将此File转换为路径名字符串(获取构建时的路径)。
    • public String getName() :返回由此File表示的文件或目录的名称。
    • public long length() :返回由此File表示的文件的长度。

    高级方法

    • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
    • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

    递归

    概述

    递归就是方法内部自己调用自己.

    注意事项

    • 必须有出口,否则会出现栈内存溢出的错误.
    • 递归的次数不宜过多.否则容易出现栈内存溢出
    • 构造方法不能递归

    理解

    对于递归,可以使用栈来理解,入栈和出栈,对于整个程序的流程,首先,main方法入栈,接着递归方法入栈,方法内调用自己,
    继续入栈,知道出口进行返回出栈,层层出栈,这个就是底层的原理吧.

    计算n的阶乘

    import java.util.Scanner;
    
    /**
     * 求n阶乘
     *  1.手动输入计算的值
     *  2.创建递归方法进行计算
     * @author WZLOVE
     * @create 2018-07-20 14:34
     */
    public class Demo1 {
    
        public static void main(String[] args) {
    
            Scanner in = new Scanner(System.in);
    
            System.out.println("请输入您要计算的值是:");
            int n = in.nextInt();
            in.close();
    
            long result = getRecursive(n);
    
            System.out.println("您输入的值的阶乘计算结果为:" + result);
    
        }
    
        public static long getRecursive(int n){
    
            // 定义出口
            if( n == 1 ){
                return 1;
            }
    
            return n * getRecursive( n - 1 );
        }
    }
    

    打印多级目录

    package com.wzlove.recursive;
    
    import java.io.File;
    
    /**
     * 遍历多级目录
     *
     * @author WZLOVE
     * @create 2018-07-20 15:11
     */
    public class Demo2 {
    
        public static void main(String[] args) {
    
            // 程序的健壮性测试
            // File file = null;
           // File file = new File("E:\");
           // 测试路径
            File file = new File("G:\工作区间\Intellij IDEA\JavaSE");
            printDirsAndFiles(file);
        }
    
        public static void printDirsAndFiles(File file){
    
            // 程序的健壮性
            if(file == null || !file.exists()){
                return ;
            }
    
            // 如果是文件,直接输出
            if(file.isFile()){
                System.out.println(file.getAbsolutePath());
            }
    
    
            // 如果是文件夹,进行遍历递
            File[] files = file.listFiles();
            // 如果没有访问权限,直接返回
            if(files == null){
                return ;
            }
            for (File file1 : files) {
    
                if(file1.isFile()){
    
                    System.out.println(file1.getAbsolutePath());
    
                } else {
    
                    System.out.println(file1.getAbsolutePath());
    
                    printDirsAndFiles(file1);
    
                }
    
            }
        }
    }
    

    打印某个目录下的所有.java文件

    两种方法,第一种:

    package com.wzlove.recursive;
    
    import java.io.File;
    
    /**
     * 搜索G:工作区间Intellij IDEAJavaSE 目录中的.java 文件。
     *  1.创建File的对象,传递File的虚拟路径
     *  2.递归方法
     *  3.进行健壮性判断:
     *      * null的判断
     *      * 文件不存在
     *      * 如果路径是文件,这三种情况都是直接返回
     *      * 如果路径合法
     *          (1) 判断有无权限,有继续向下,无直接返回
     *          (2) 返回该文件夹下的所有文件和文件夹
     *          (3) 增强for循环进行遍历
     *              如果是文件,判断是否满足要求(递归的出口)
     *              如果是文件夹,进行递归调用
     *
     * @author WZLOVE
     * @create 2018-07-20 16:27
     */
    public class Demo3 {
    
        public static void main(String[] args) {
            File file = new File("G:\工作区间\Intellij IDEA\JavaSE");
            printAllJavaFiles(file);
        }
    
        public static void printAllJavaFiles(File file){
            if(file == null || !file.exists() || file.isFile()){
                return ;
            }
    
            File[] files = file.listFiles();
            if(files == null){
                return ;
            }
            for (File file1 : files) {
                if(file1.isFile()){
                    if(file1.getName().endsWith(".java")){
                        System.out.println(file1.getAbsolutePath());
                    }
                }else{
                    printAllJavaFiles(file1);
                }
            }
        }
    
    }
    

    第二种,要使用到文件过滤器:

    • File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。

        package com.wzlove.recursive;
        
        import java.io.File;
        import java.io.FileFilter;
        
        /**
         *
         * @author WZLOVE
         * @create 2018-07-20 16:27
         */
        public class Demo4 {
        
            public static void main(String[] args) {
                File file = new File("G:\工作区间\Intellij IDEA\传智播客\JavaSE");
                printAllJavaFiles(file);
            }
        
            public static void printAllJavaFiles(File file){
                if(file == null || !file.exists() || file.isFile()){
                    return ;
                }
        
                // 使用listFiles(FileFilter)
                /**
                 * File[] listFiles(FileFilter filter)
                 * 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
                 */
                File[] files = file.listFiles(new FileFilter() {
                    @Override
                    public boolean accept(File pathname) {
                        if(pathname.isFile() && pathname.getName().endsWith(".java")){
                            // 是以.java文件结尾的文件
                            return true;
                        }
                        // 如果是文件夹,也进行返回
                        if(pathname.isDirectory()){
                            return true;
                        }
                        // 其余情况返回false
                        return false;
                    }
                });
        
                for (File file1 : files) {
                    if(file1.isFile()){
                        System.out.println(file1.getAbsolutePath());
                    }else{
                        printAllJavaFiles(file1);
                    }
                }
        
            }
        
        }
  • 相关阅读:
    子组件 调用父组件方法
    加载进度条
    form 验证 自定义
    关于读取本地text文件,自动被添加空格的问题
    关于form表单中button按钮自动提交问题
    正态分布折线图/直方图相关方法以及概念
    大于0的数字(包含小数和整数)的正则表达式
    bigdecimal类型除法问题
    添加数据库的Maven依赖(SqlServer,Oracle)
    JS中null与undefined的区别
  • 原文地址:https://www.cnblogs.com/wadmwz/p/9342863.html
Copyright © 2011-2022 走看看