码迷,mamicode.com
首页 > 其他好文 > 详细

13、IO (File、递归)

时间:2019-02-05 00:32:12      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:ret   on()   let   path   str   文件过滤器   efi   自身   roo   

File

File类的概述和作用

* A:File类的概述和作用
    * a: File的概念
        * File类是文件和目录路径名的抽象表示形式
        * Java中把文件或者目录(文件夹)都封装成File对象
        * 我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可

File类静态的成员变量

* A:File类静态的成员变量
    * a: pathSeparator
        * 与系统有关的路径分隔符,为了方便,它被表示为一个字符串
    * b: separator
        * 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串
        
    * c: 案例代码
        /*
         *  java.io.File
         *    将操作系统中的,文件,目录(文件夹),路径,封装成File对象
         *    提供方法,操作系统中的内容
         *    File与系统无关的类
         *    文件 file
         *    目录 directory
         *    路径 path
         */
        public class FileDemo {
            public static void main(String[] args) {
                //File类静态成员变量
                //与系统有关的路径分隔符
                String separator = File.pathSeparator;
                System.out.println(separator);// 是一个分号,目录的分割(window中环境变量配置各个路径用分号分割,表示一个完整的路径结束)  Linux中是冒号 :
                
                //与系统有关的默认名称分隔符
                separator = File.separator;
                System.out.println(separator);// 向右 \  目录名称分割  Linux / 
            }
        }

?

File类构造方法_1

* A: File类构造方法_1
    * a: File(String pathname)
        * 通过将给定路径名字符串转换为一个File对象,之后可以使用File中的方法
        * windows中的路径或文件名不区分大小写
    * d: 案例代码
        public class FileDemo1 {
            public static void main(String[] args) {
                function();
            }
            /*
             *  File(String pathname)
             *  传递路径名: 可以写到文件夹,可以写到一个文件
             *  c:\\abc   c:\\abc\\Demo.java
             *  将路径封装File类型对象
             */
            public static void function(){
                File file = new File("d:\\eclipse");
                System.out.println(file);
            }
        }

相对路径和绝对路径

* A: 相对路径和绝对路径
    * a: 绝对路径
        * 绝对路径是一个固定的路径,从盘符开始
    * b: 相对路径
        * 相对路径相对于某个位置,在eclipse下是指当前项目下  
    * c: 路径
            绝对路径
                在系统中具有唯一性
                c:\\windows\\system32
            相对路径
                表示路径之间的关系
                D:\\develop\\Java\\jdk1.7.0_72\\bin
                D:\\develop\\Java\\jre7
                路径之间关系
                    Java 父目录是D:\\develop
                    Java 子目录是:jdk1.7.0_72
                父路径是 唯一性
                子目录是可以多个

?

File类的构造方法_2

* A: File类的构造方法_2
    * a:File(String parent, String child) 
        * 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 对象
                        
    * b: File(File parent, String child)
    
    * c: 案例代码
    public class FileDemo1 {
        public static void main(String[] args) {
            function_2();
        }
        /*
         *  File(File parent,String child)
         *  传递路径,传递File类型父路径,字符串子路径
         *  好处: 父路径是File类型,父路径可以直接调用File类方法
         */
        public static void function_2(){
            File parent = new File("d:");
            File file = new File(parent,"eclipse");
            System.out.println(file);
        }
        
        /*
         *  File(String parent,String child)
         *  传递路径,传递字符串父路径,字符串子路径
         *  好处: 单独操作父路径和子路径
         */
        public static void function_1(){
            File file = new File("d:","eclipse");
            System.out.println(file);
        }
    }

?

File类创建文件功能

* A: File类创建文件功能
    * a: public boolean createNewFile()
        * 创建文件 如果存在这样的文件,就不创建了
            
    * b: 案例代码
        public class FileDemo2 {
            public static void main(String[] args)throws IOException {
                function();
            }                       
            /*
             *  File创建文件的功能
             *  boolean createNewFile()
             *  创建的文件路径和文件名,在File构造方法中给出
             *  文件已经存在了,不在创建
             */
            public static void function()throws IOException{
                File file = new File("c:\\a.txt");
                boolean b = file.createNewFile();
                System.out.println(b);
            }
        }

?

File类创建目录功能

* A: File类创建目录功能
    * a: 创建目录
        * public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
        * public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
    * b: 案例代码
        public class FileDemo2 {
            public static void main(String[] args)throws IOException {
                function_1();
            }
            /*
             *  File创建文件夹功能
             *  boolean mkdirs() 创建多层文件夹
             *  创建的路径也在File构造方法中给出
             *  文件夹已经存在了,不在创建
             */
            public static void function_1(){
                File file = new File("c:\\abc");
                boolean b = file.mkdirs();
                System.out.println(b);
            }               
        }

File类删除功能

* A: File类删除功能
    * a: 删除功能
        * public boolean delete():删除文件或者文件夹
* B: 案例代码
    public class FileDemo2 {
        public static void main(String[] args)throws IOException {
            function_2();
        }
        /*
         *  File类的删除功能
         *  boolean delete()
         *  删除的文件或者是文件夹,在File构造方法中给出
         *  删除成功返回true,删除失败返回false
         *  删除方法,不走回收站,直接从硬盘中删除
         *  删除有风险,运行需谨慎
         */
        public static void function_2(){
            File file = new File("c:\\a.txt");
            boolean b = file.delete();
            System.out.println(b);
        }           
    }

File类获取功能

* A:File类获取功能
    * a: 方法介绍
        * String getName(): 返回路径中表示的文件或者文件夹名
            * 获取路径中的最后部分的名字
        * long length(): 返回路径中表示的文件的字节数
        * String getAbsolutePath(): 获取绝对路径,返回String对象
        * File   getAbsoluteFile() : 获取绝对路径,返回File对象
            * eclipse环境中,写一个相对路径,绝对位置工程根目录
        * String getParent(): 获取父路径,返回String对象
        * File getParentFile(): 获取父路径,返回File对象
                
    * b: 案例代码
    
        public class FileDemo3 {
            public static void main(String[] args) {
                function_3();
            }
            /*
             * File类的获取功能
             * String getParent() 返回String对象
             * File getParentFile()返回File对象
             * 获取父路径
             */
            public static void function_3(){
                File file = new File("d:\\eclipse\\eclipse.exe");
                File parent = file.getParentFile();
                System.out.println(parent);
            }
            
            /*
             * File类获取功能
             * String getAbsolutePath() 返回String对象
             * File   getAbsoluteFile() 返回File对象
             * 获取绝对路径
             * eclipse环境中,写的是一个相对路径,绝对位置工程根目录
             */
            public static void function_2(){
                File file = new File("src");
                File absolute = file.getAbsoluteFile();
                System.out.println(absolute);
            }
            
            /*
             * File类获取功能
             * long length()
             * 返回路径中表示的文件的字节数
             */
            public static void function_1(){
                File file = new File("d:\\eclipse\\eclipse.exe");
                long length = file.length();
                System.out.println(length);
            }
            
            /*
             *  File类的获取功能
             *  String getName()
             *  返回路径中表示的文件或者文件夹名
             *  获取路径中的最后部分的名字
             */
            public static void function(){
                File file = new File("d:\\eclipse\\eclipse.exe");
                String name = file.getName();
                System.out.println(name);
                
                /*String path = file.getPath();
                System.out.println(path);*/
        //      System.out.println(file);
            }
        }

?

File类判断功能

* A: File类判断功能
    * a: 方法介绍
        * boolean exists(): 判断File构造方法中封装路径是否存在
            * 存在返回true,不存在返回false
        * boolean isDirectory(): 判断File构造方法中封装的路径是不是文件夹
            * 如果是文件夹,返回true,不是文件返回false
        * boolean isFile(): 判断File构造方法中封装的路径是不是文件
            * 如果是文件,返回true,不是文件返回false

    * b: 案例代码
        public class FileDemo4 {
            public static void main(String[] args) {
                function_1();
            }
            /*
             *  File判断功能
             *  boolean isDirectory()
             *  判断File构造方法中封装的路径是不是文件夹
             *  如果是文件夹,返回true,不是文件返回false
             *  
             *  boolean isFile()
             *  判断File构造方法中封装的路径是不是文件
             */
            public static void function_1(){
                File file = new File("d:\\eclipse\\eclipse.exe");
                if(file.exists()){
                    boolean b = file.isDirectory();
                    System.out.println(b);
                }
            }
            
            /*
             *  File判断功能
             *  boolean exists()
             *  判断File构造方法中封装路径是否存在
             *  存在返回true,不存在返回false
             */
            public static void function(){
                File file = new File("src");
                boolean b = file.exists();
                System.out.println(b);
            }
        }

File类list获取功能

* A: File类list获取功能
    * a: 方法介绍
        * String[] list():获取到File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
            * 返回只有名字
        * File[] listFiles():获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
            * 返回的是目录或者文件的全路径
        * static File[] listRoots(): 列出可用的文件系统根 
    
    * b: 案例代码
        public class FileDemo {
            public static void main(String[] args) {
                function_2();
            }
            public static void function_2(){
                //获取系统中的所有根目录
                File[] fileArr = File.listRoots();
                for(File f : fileArr){
                    System.out.println(f);
                }
            }
            
            /*
             *  File类的获取功能
             *  File[] listFiles()
             *  获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
             *  返回的是目录或者文件的全路径
             */
            public static void function_1(){
                File file = new File("d:\\eclipse");
                File[] fileArr = file.listFiles();
                for(File f : fileArr){
                    System.out.println(f);
                }
            }
            
            /*
             *  File类的获取功能
             *  String[] list()
             *  获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
             *  返回只有名字
             */
            public static void function(){
                File file = new File("c:");
                String[] strArr = file.list();
                System.out.println(strArr.length);
                for(String str : strArr){
                    System.out.println(str);
                }
            }
        }

文件过滤器

* A: 文件过滤器
    * a: 作用
        * 过滤一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹
        
    * b: 方法介绍
        * public String[] list(FilenameFilter filter)
        * public File[] listFiles(FileFilter filter)
        
    * C: 案例代码   
        /*
         *  自定义过滤器
         *  实现FileFilter接口,重写抽象方法
         */
        public class MyFilter implements FileFilter{
            public boolean accept(File pathname)  {
                /*
                 * pathname 接受到的也是文件的全路径
                 * c:\\demo\\1.txt
                 * 对路径进行判断,如果是java文件,返回true,不是java文件,返回false
                 * 文件的后缀结尾是.java
                 */
                //String name = pathname.getName();
                return pathname.getName().endsWith(".java");
                
            }
        }
        
        /*
         *  File类的获取,文件获取过滤器
         *  遍历目录的时候,可以根据需要,只获取满足条件的文件
         *  遍历目录方法 listFiles()重载形式
         *  listFiles(FileFilter filter)接口类型
         *  传递FileFilter接口的实现类
         *  自定义FileFilter接口实现类,重写抽象方法,
         *  接口实现类对象传递到遍历方法listFiles
         */
        public class FileDemo1 {
            public static void main(String[] args) {
                File file = new File("c:\\demo");
                File[] fileArr = file.listFiles(new MyFilter());
                for(File f : fileArr){
                    System.out.println(f);
                }
            }
        }

文件过滤器_原理分析

* A:文件过滤器_原理分析
    * listFiles()遍历目录的同时,获取到了文件名全路径,调用过滤器的方法accept,将获取到的路径传递给accept方法的参数pathname
    * accept方法接收了参数pathname,参数是listFiles传递来的
    * 在accept方法中,进行判断,如果这个路径是Java文件,返回true,走着返回false
    * 一旦方法返回了true
    * listFiles将路径保存到File数组中

递归

递归遍历全目录

* A: 递归遍历全目录
    * a: 案例代码
        /*
         *  对一个目录的下的所有内容,进行完全的遍历
         *  编程技巧,方法的递归调用,自己调用自己
         */
        public class FileDemo {
            public static void main(String[] args) {
                File dir = new File("d:\\eclipse");
                getAllDir(dir);
            }
            /*
             *  定义方法,实现目录的全遍历
             */
            public static void getAllDir(File dir){
                System.out.println(dir);
                //调用方法listFiles()对目录,dir进行遍历
                File[] fileArr = dir.listFiles();
                for(File f : fileArr){
                    //判断变量f表示的路径是不是文件夹
                    if(f.isDirectory()){
                        //是一个目录,就要去遍历这个目录
                        //本方法,getAllDir,就是给个目录去遍历
                        //继续调用getAllDir,传递他目录
                        getAllDir(f);
                    }else{
                        System.out.println(f);
                    }
                }
            }
        }

?

递归概念和注意事项

* A:递归概念和注意事项
    * a: 递归概念
        * 递归,指在当前方法内调用自己的这种现象
        * 递归分为两种,直接递归和间接递归
        * 直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
    * b: 注意事项
        * 递归一定要有出口, 必须可以让程序停下
        * 递归次数不能过多
        * 构造方法,禁止递归

递归求和计算

* A: 递归求和计算
    * a: 题目分析
    * 1+2+3+...+(n-1)+n:求1到n的和
    * 总结规律:1到n的和等于1到(n-1)的和再加n
    * getSum(n-1)+ n
    * 递归出口:getSum(1) return 1;
    * b: 案例代码
    /*
     *  方法的递归调用
     *    方法自己调用自己
     *  适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化
     *  注意:
     *     递归一定要有出口, 必须可以让程序停下
     *     递归次数不能过多
     *     构造方法,禁止递归
     */
    public class DiGuiDemo {
        public static void main(String[] args) {
            int sum = getSum(3);
            System.out.println(sum);
        }
        /*
             *  计算 1+2+3+100和 = 5050
             *  计算规律:
             *    n+(n-1)+(n-2)
             *    100+(100-1)+(99-1)+...1
             */
        public static int getSum(int n){
            if( n == 1)
                return 1;
            return n + getSum(n-1);
        }
    }

?

递归求阶乘

* A: 递归求和计算
    * a: 题目分析
        * 5!=5*4*3*2*1
        *   =5*4!
        * 4!=4*3!
        * 3!=3*2!
        * 2!=2*1!
        * 1!=1
        * n!=n*(n-1)!
        * 递归出口:n*getJieCheng(n-1):  getJieCheng(1) return 1;
    * b: 案例代码
        /*
         *  方法的递归调用
         *    方法自己调用自己
         *  适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化
         *  注意:
         *     递归一定要有出口, 必须可以让程序停下
         *     递归次数不能过多
         *     构造方法,禁止递归
         */
        public class DiGuiDemo {
            public static void main(String[] args) {                    
                System.out.println(getJieCheng(5));
                
            }
                            
            /* 
             *  计算阶乘 5!
             *   5*4*3*2*1
             */
            public static int getJieCheng(int n){
                if ( n == 1)
                    return 1;
                return n * getJieCheng(n-1);
            }                               
        }

递归计算斐波那契数列

* A: 递归计算斐波那契数列
    * a:题目分析
        * 1 1 2 3 5 8 13 21
        * 从第三项开始,后面的每一项都等于前面两项的和,第一项和第二项的值为1,作为程序的出口
    * b: 案例代码
        /*
         *  方法的递归调用
         *    方法自己调用自己
         *  适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化
         *  注意:
         *     递归一定要有出口, 必须可以让程序停下
         *     递归次数不能过多
         *     构造方法,禁止递归
         */
        public class DiGuiDemo {
            public static void main(String[] args) {                    
                System.out.println(getFBNQ(12));
            }
            /*
             *  方法递归,计算斐波那契数列
             *  
             */
            public static int getFBNQ(int month){
                if( month == 1)
                    return 1;
                if( month == 2)
                    return 1;
                return getFBNQ(month-1)+getFBNQ(month-2);
            }
        }

遍历目录下的所有java文件

* A: 遍历目录下的所有java文件
    * a: 案例代码
        public class MyJavaFilter implements FileFilter {
            public boolean accept(File pathname) {
                //判断获取的是目录,直接返回true
                if(pathname.isDirectory())
                    return true;
                return pathname.getName().toLowerCase().endsWith(".java");
            }

        }
        /*
         *  遍历目录,获取目录下的所有.java文件
         *  遍历多级目录,方法递归实现
         *  遍历的过程中,使用过滤器
         */
        public class FileDemo1 {
            public static void main(String[] args) {
                getAllJava(new File("c:\\demo"));
        //      new File("c:\\demo").delete();
            }
            /*
             * 定义方法,实现遍历指定目录
             * 获取目录中所有的.java文件
             */
            public static void getAllJava(File dir){
                //调用File对象方法listFiles()获取,加入过滤器
                File[] fileArr = dir.listFiles(new MyJavaFilter());
                for(File f : fileArr){
                    //对f路径,判断是不是文件夹
                    if(f.isDirectory()){
                        //递归进入文件夹遍历
                        getAllJava(f);
                    }else{
                        System.out.println(f);
                    }
                }
            }
        }

总结

递归: 方法定义中调用方法本身的现象

? 直接递归

public void methodA(){
    methodA();
}

? 间接递归

public void metohdB(){
    methodC();
}

public void methodC(){
    methodB();
}

? 递归注意事项

? 要有出口,否则就是死递归

? 次数不能太多,否则就内存溢出

File: 文件和目录路径名的抽象表示形式

? 构造方法:

? public File(String pathname) 通过给定的文件或文件夹的路径,来创建对应的File对象

? public File(String parent, String child) 通过给定的父文件夹路径,与给定的文件名称或目录名称来创建对应的File对象

? public File(File parent, String child)通过给定的File对象的目录路径,与给定的文件夹名称或文件名称来创建对应的File对象

? 路径的分类

? 绝对路径, 带盘盘符

? E:\Workspace\day20_File\abc.txt

? 相对路径, 不带盘符

? day20_File\abc.txt

? 注意

? 当指定一个文件路径的时候,如果采用的是相对路径,默认的目录为 项目的根目录

? 方法

public boolean createNewFile()创建文件

返回值为true, 说明创建文件成功

返回值为false,说明文件已存在,创建文件失败

public boolean mkdir() 创建单层文件夹

创建文件夹成功,返回 true

创建文件夹失败,返回 false

public boolean mkdirs() 创建多层文件夹

public boolean delete()

删除此抽象路径名表示的文件或目录。

如果此路径名表示一个目录,则该目录必须为空才能删除
public boolean isDirectory() 判断是否为文件夹

public boolean isFile() 判断是否为文件

public boolean exists() 判断File对象对应的文件或文件夹是否存在

public String getAbsolutePath() 获取当前File的绝对路径

public String getName() 获取当前File对象的文件或文件夹名称

public long length() 获取当前File对象的文件或文件夹的大小(字节)

public File[] listFiles() 获取File所代表目录中所有文件或文件夹的绝对路径

13、IO (File、递归)

标签:ret   on()   let   path   str   文件过滤器   efi   自身   roo   

原文地址:https://www.cnblogs.com/yoci/p/10352355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!