Java26File类:new File(),递归

Posted 码农编程录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java26File类:new File(),递归相关的知识,希望对你有一定的参考价值。


1.File类三个构造方法和获取方法:\\

在这里插入图片描述

package com.itheima01.constructor;
import java.io.File;  
/*
    File : 既表示文件,又表示文件夹
  	1. File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
	2. File(File parent, String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
	3. File(String parent, String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

    路径分隔符:
        1. windows :  \\
        2. Unix : / 正斜杠在java中, 用 / 或 \\\\ 都可以
*
*       正则表达式 : 用简短的符号来表示复杂的意思 
*           \\t : 表示制表符 tab
*           \\r\\n : 表示回车换行
*           \\\\ : 表示一个\\
*/
public class Demo01 {
    public static void main(String[] args) {
        // new File("C:\\\\test\\\\a.txt");
        File file = new File("C:/test/a.txt"); //直接指定一个完整路径
        System.out.println(file);
        
        File file2 = new File("C:/test", "a"); //a表示文件夹 //指定一个父路径+名字
        System.out.println(file2);        
        //如下同上  
        File fu = new File("C:/test");
        File file3 = new File(fu, "a");
        System.out.println(file3);
    }
}
package com.itheima02.method;
import java.io.File;
/*
   获取方法
		1. String getAbsolutePath() :返回此File的绝对路径名字符串。
		2. String getPath() :将此File转换为路径名字符串。(构造时使用的路径)
		3. String getName() :返回由此File表示的文件或目录的名称。(路径最后一级名称)
		4. long length() :返回由此File表示的文件的长度。(文件夹的大小无法获取)
    路径:
        1. 绝对路径 :  带盘符的路径
        2. 相对路径 :  相对而言的路径(java工程中,相对当前工程而言) 
*/ 
public class GetDemo {
    public static void main(String[] args) {
        File file1 = new File("E:\\\\mywork\\\\IdeaProjects\\\\class897\\\\day11\\\\a.txt");
        File file2 = new File("a.txt"); //在当前项目里找
        String absPath1 = file1.getAbsolutePath();
        String absPath2 = file2.getAbsolutePath();
        System.out.println(absPath1); //E:\\mywork\\IdeaProjects\\class897\\day11\\a.txt
        System.out.println(absPath2); //打印同上行,没有包路径如com..

        String path1 = file1.getPath();
        String path2 = file2.getPath();
        System.out.println(path1); //E:\\mywork\\IdeaProjects\\class897\\day11\\a.txt
        System.out.println(path2); //a.txt

        String name = file1.getName();
        String name2 = file2.getName();
        System.out.println(name); //a.txt
        System.out.println(name2); //a.txt

        long length = file1.length();
        System.out.println(length); //3 byte,因为a.txt里有abc三个字母
        File src = new File("src");
        System.out.println(src.length()); //0,不能获取文件夹大小
    }
}

如下是项目路径
在这里插入图片描述

2.File的判断/创建/删除/列举方法:listFiles

package com.itheima02.method;
import java.io.File;
/*
   判断方法
		1. public boolean exists() :此File表示的文件或目录是否实际存在。
		2. public boolean isDirectory() :此File表示的是否为目录。
		3. public boolean isFile() :此File表示的是否为文件。
*/
public class BooleanDemo {
    public static void main(String[] args) {
        File f1 = new File("src"); //目录
        File f2 = new File("a.txt");
        File f3 = new File("xxx");
        System.out.println(f1.exists());//true //因为在day11模块下找
        System.out.println(f2.exists());//true
        System.out.println(f3.exists());//false
        System.out.println("-------------------");
        
        System.out.println(f1.isDirectory());//true
        System.out.println(f2.isDirectory());//false
        System.out.println(f3.isDirectory());//false
        System.out.println("---------------");		
        
        System.out.println(f1.isFile()); // false
        System.out.println(f2.isFile());// true
        System.out.println(f3.isFile());//false
    }
}
package com.itheima02.method;
import java.io.File;
import java.io.IOException;
/*
*       1. public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
*           1. 如果文件不存在,则创建,返回true
*           2. 如果文件存在,不创建,返回false
*           3. 如果文件父路径不存在,则抛出IOException
		2. public boolean mkdir() :创建由此File表示的目录。 (make directory)
            1. 如果父路径不存在, 不会创建
            2. 如果目录已存在,也不会创建,都返回false
	    3. public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。(多级)
*/
public class CreateDemo {
    public static void main(String[] args) throws IOException {
//        create();
        File dir = new File("ccc"); //单级路径也算多级路径中一种
        boolean result = dir.mkdirs();
        System.out.println(result); //true
    } 
    
    private static void create() throws IOException {
        File file = new File("dir/xxx");
        boolean result = file.createNewFile();
        System.out.println(result); //false,dir不存在
    }
}
package com.itheima02.method;
import java.io.File;  
/*
*  public boolean delete() :删除由此File表示的文件或目录。
*           1. 此方法不走回收站, 慎用
*           2. delete可以删除 空文件夹和文件
*           3. 删不了非空文件夹,返回false。一个文件被其他程序所占用,其他程序无法删除,win下word一直用原文件,绘图软件是复制一份。所以word在使用修改时原文件删不了,绘图可以删除原文件
*/
public class DeleteDemo {
    public static void main(String[] args) { 
        File file = new File("c:/test/b");
        boolean result = file.delete();
        System.out.println(result);
    }
}
package com.itheima02.method;
import java.io.File;
/*
  目录的遍历
	1. public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
	    1. 此方法只能用在文件夹上
	    2. 列出当前文件夹的所有子文件and子文件夹
	2. public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录
*/
public class ListDemo {
    public static void main(String[] args) {
        File file = new File("c:/test/filedoc");  // 需求: 打印目录 C:\\test\\filedoc 下的所有文件(单级)
      /*  String[] list = file.list(); 
        for (String name : list) {
            System.out.println(name);  
        }*/
        
		//如下(列出对象)等同于上面(列出名字)
        File[] files = file.listFiles(); 
        for (File sonFile : files) {
            System.out.println(sonFile.getAbsolutePath());
        }
    }
}

3.案例:listFiles,isFile,.delete()

package com.itheima03.recursion;
import java.io.File;
/*
*   需求: 删除非空文件夹 filedoc
*       前提: delete方法不能直接删除非空文件夹
*   解决: 1. 列出文件夹下的所有子路径(子文件和子文件夹)
*         2. 进行遍历
*         3. 判断每个子路径 是文件还是文件夹
*           3.1. 如果是文件,直接删
*           3.2 如果是文件夹
*               1. 接着列出此文件夹的所有子路径
*               2. 进行遍历
*               3. 判断每个子路径 是文件还是文件夹
*                   3.1 如果是文件,直接删
*                   3.2 如果是文件夹...
*                                 ....
*  有一段逻辑不断重复,重复的次数不知道, 但是结束条件: 删除到最后一级文件夹的子文件全都删掉
*/
public class DeleteDemo {
    public static void main(String[] args) {
        File dir = new File("c:/test/filedoc");
//        file.delete(); //无用,删不了非空文件夹
        deleteDir(dir);
    }    
    
    private static void deleteDir(File dir) {
        File[] files = dir.listFiles();
        for (File sonFile : files) {
            if(sonFile.isFile()){//是文件
                sonFile.delete();
            }else{//是文件夹
                deleteDir(sonFile);
            }
        }
        //如上是把子文件夹删了
        dir.delete(); //自己变成空文件夹,就可以删掉
    }
}

在这里插入图片描述

package com.itheima03.recursion;
/*
*   5! = 5 * 4 * 3 * 2 * 1 = 120
*   递归计算阶乘:
*       0.表现形式: 方法不断调用自己
*       1. 每个步骤规律相同
*       2. 一定要有结束条件
*       5! = 5 * 4 * 3 * 2 * 1
*          = 5 * 4!
*                = 4 * 3!
*                       = 3 * 2!
*                             = 2 * 1!
*                                   = 1
*      归纳:
*           当 n>1
*                   n!= n * (n-1)!
*           当 n=1 ,  n!  = 1
*/
public class JieChengDemo {
    public static void main(String[] args) {
        // method01();
        int result = getResult(10);
        System.out.println(result);
    }

//111111111111111111111111111111111111111111111111111111111111   
    private static int getResult(int n) { //计算n的阶乘
        if(n == 1){
            return 1;
        }else{
            int result = n * getResult(n-1);
            return result;
        }
    }

    private static void method01() {
        int n = 5;
        int result = 1;
        for (int i = n; i >= 1; i--) {
            result *= i;
        }
        System.out.println(result);
    }
}

堆内存溢出:out of memory
在这里插入图片描述

package com.itheima03.recursion;
import java.io.File;
/*
*   案例 : 计算非空文件夹的大小。length() : 计算文件的大小
*   思路: 1. 列出此文件夹的所有子路径
*        2. 遍历每个子路径
*        3. 判断是文件还是文件夹
*           3.1 是文件, 加总其大小
*           3.2 是文件夹, 递归
*   隐含结束条件:  文件夹不可能无限创建的
*/
public class CalcDemo {
    static int sum = 0;    
    public static void main(String[] args) {
        File dir = new File("c:/test/filedoc");
        calc(dir);
        System.out.println(sum);
    }    

    private static void calc(File dir) {
        File[] files = dir.listFiles();
        for (File sonFile : files) {
            if(sonFile.isFile()){ // 子文件
                sum += sonFile.length();
            }else{ //文件夹
                calc(sonFile);
            }
        }
    }
}

不死神兔:上个月都不死。1是一对。||是或。n是n个月。前不死,第3都生1。
在这里插入图片描述

package com.itheima03.recursion;
/*
*   斐波那契数列 : 有一对兔子,从第三个月开始生一对小兔子,之后每个月都生一对小兔子,其他兔子具备相同特点.
*    而且兔子永远不死,问第20个月,兔子有几对?
*/
public class RabbitDemo {
    public static void main(String[] args) {
        int n = 6; //第6个月
        int result = calcRabbit(n);
        System.out.println(result); //8
    }     
           
    private static int calcRabbit(int n) { //计算n个月兔子的对数
        if(n == 1 || n == 2){
            return 1;
        }else{
           return calcRabbit(n-1) + calcRabbit(n-2); //上个月和上两个月兔子相加
        }
    }
}
package com.itheima03.recursion;
public class RabbitDemo02 { 
//用循环写,不用递归【递归不需要思考循环次数,但比循环占内存多,因为循环只有一个方法】
    public static void main(String[] args) {
        int n = 20;
        int[] array = new int[n]; // 20个月不同月份兔子数量
        array[0] = 1; // 第一个月
        array[1] = 1; // 第二个月
        for (int i = 2; i < n; i++) {
            array[i] = array[i-1] + array[i-2];
        }
        System.out.println(array[19]); //6765
    }
} 

在这里插入图片描述

以上是关于Java26File类:new File(),递归的主要内容,如果未能解决你的问题,请参考以下文章

java是否用File f=new file;创建文件的

chapter20_File类递归

JAVA File类 打印目录树状结构图 递归算法

java类file实现文件递归查找指定文件名后缀,过滤器

File类,递归

Java基础-File类篇递归篇