最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

热推荐:java -- File类和递归

来源:博客园


(资料图片)

File类

java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。File类将文件,文件夹和路径封装成了对象,提供大量的方法来操作这些对象。

静态常量

// 静态常量static String pathSeparator // 与系统有关的路径分隔符// Window操作系统,分隔符是分号;// Linux操作系统,分隔符是冒号:static String separator // 与系统有关的名称分隔符// Window操作系统,名称分割符号为 \// Linux操作系统,名称分隔符号为 /

绝对路径和相对路径

  • 绝对路径:从盘符(Windows)或"/"(Linux)开始的路径,这是一个完整的路径,绝对路径具有唯一性
  • 相对路径:相对于某个目录的路径,这是一个便捷的路径,开发中经常使用,java中写的相对路径, 一般都是相对于当前项目
// Windows绝对路径 WindowsString path1 = "E:\\study\\java\\5_projects\\FileClass\\test";String path2 = "/opt/html/dist"// 相对路径String path3 = "FileClass\\test";

构造方法

public File(String pathname)// 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例public File(String parent, String child)// 从父路径名字符串和子路径名字符串创建新的 File实例public File(File parent, String child)// 从父抽象路径名和子路径名字符串创建新的 File实例
// 根据给定的路径 创建File对象File file1 = new File("E:\\study\\java\\5_projects\\FileClass\\test");System.out.println(file1.toString() + "\t " + file1.getPath());// 传入字符串的父路径 和 字符串的子路径 创建File对象File file2 = new File("E:\\study\\java\\5_projects\\FileClass","test");System.out.println(file2);File file3 = new File("E:\\study\\java\\5_projects","\\FileClass\\test");System.out.println(file3);// 传入File类型的父路径 和 字符串类型的子路径File file4 = new File(file1, "1.txt");System.out.println(file4);

注意:

  1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
  2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。

获取某些属性

public File getAbsoluteFile() // 获取绝对路径(File类型)public String getAbsolutePath() // 获取绝对路径(字符串类型)public String getPath() // 返回字符串类型的路径public String getName() // 获取文件名public long length() // 获取文件字节数, 不存在返回0public File getParentFile() //返回File类型的父路径public long lastModified() // 返回最后修改时间
// 获取绝对路径(字符串类型)System.out.println("绝对路径为: " + new File("FileClas\\src").getAbsoluteFile());System.out.println(file4.getAbsolutePath());// 获取绝对路径(File类型)System.out.println(file4.getAbsoluteFile());// 获取相对路径下的File对象File file6 = new File("FileClass" + File.separator + "test" + File.separator + "2.txt");System.out.println(file6.getAbsolutePath());// 获取字符串类型的路径 直接打引结果相同// 直接打印(toString)调用了getPath方法System.out.println(file1.getPath());// 获取文件名System.out.println(new File("FileClass/test/1.txt").getName());// 获取文件字节数, 不存在返回0long fileLength = new File("FileClass/test/1.txt").length();System.out.println(fileLength);// 获取父路径, 返回File对象File parentFile = new File("FileClass/test/1.txt").getParentFile();System.out.println(parentFile);System.out.println(parentFile.getParentFile());// 获取最后修改时间long lastModifyTime = new File("FileClass/test/1.txt").lastModified();System.out.println(lastModifyTime + "\t" + new Date(lastModifyTime));

判断的方法

public boolean exists()// 判断路径是否存在, 存在返回truepublic boolean isFile()// 判断是否为文件 文件返回true, 目录返回false, 路径不存在也返回falsepublic boolean isDirectory()// 判断是否为目录, 目录返回true, 文件返回false, 路径不存在也返回false
// 判断路径是否存在, 存在返回trueSystem.out.println(new File("FileClass/test/NewDir1").exists());// 判断是否为文件 文件返回true, 目录返回false, 路径不存在也返回falseSystem.out.println(file6.isFile());// 判断是否为目录, 目录返回true, 文件返回false, 路径不存在也返回falseSystem.out.println(new File("FileClass/test/NewDir1").isDirectory());// 因此 判断某文件是文件/文件夹时 要先判断路径是否存在if (file1.exists()) {    if(file1.isFile()) {        System.out.println("文件");    } else {        System.out.println("目录");    }} else {    System.out.println("文件不存在");}

创建和删除文件

public boolean createNewFile() throws IOException// 创建文件, 成功返回true, 存在则不创建public boolean mkdir()// 创建单级目录, 成功返回true, 存在则不创建public boolean mkdirs()// 创建单/多级目录, 成功返回true, 存在则不创建public boolean delete()// 删除文件或空目录, 成功返回true
// 创建文件, 成功返回true, 失败返回falseSystem.out.println(file6.createNewFile());// 创建目录, 成功返回true, 失败返回falseSystem.out.println(new File("FileClass/test/NewDir1").mkdir());System.out.println(new File("FileClass/test/NewDir2/NewDir3/NewDir4").mkdirs());// 删除文件 和 空目录System.out.println(file6.delete());System.out.println(new File("FileClass/test/NewDir1").delete());// 创建目录//StringBuilder sb = new StringBuilder("FileClass/test/");//for (int i = 0; i < 200; i++) {//    sb.append(i);//    sb.append("/");//}//System.out.println(new File(sb.toString()).mkdirs());////删除目录//File fileForDel = new File(sb.toString());//do {//    try {//        if (Integer.parseInt(fileForDel.getName()) < 0) {//            System.out.println("删除失败");//            return;//        }//    } catch (NumberFormatException e) {//        return;//    }//    fileForDel.delete();//    fileForDel = fileForDel.getParentFile();//} while (true);

遍历目录

public String[] list()// 返回目录下所有文件 存放在字符串数组中public File[] listFiles()// 返回目录下所有文件 存放在File数组中
String[] arr = new File("FileClass/test").list();for (String s : arr) {    System.out.println(s);}File[] fileArr = new File("FileClass/test").listFiles();for (File file : fileArr) {    System.out.println(file + "\t" + file.getName());}

FileFilter接口

文件过滤器接口,此接口的实现类可以传递给方法listFiles(),实现文件的过滤功能public boolean accept(File path):方法参数就是listFiles()方法获取到的文件或者目录的路径。如果方法返回true,表示需要此路径,否则此路径将被忽略。

File dir = new File(".\\ConcurrentProgramming\\src\\_5_ThreadPool");File[] files = dir.listFiles(new FileFilter() {    @Override    public boolean accept(File pathname) {        //判断如果获取到的是目录,直接放行        if(pathname.isDirectory())            return true;        //获取路径中的文件名,判断是否java结尾,是就返回true        return pathname.getName().toLowerCase().endsWith("java");    }});for(File file : files){    System.out.println(file);}

递归

指在当前方法内调用自己的这种现象。

public static void a(){    a();}

递归求和

计算1 ~ n的和

分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。

实现代码:

public static void main(String[] args) {    //计算1~num的和,使用递归完成    int num = 5;    // 调用求和的方法    int sum = getSum(num);    // 输出结果    System.out.println(sum);}public static int getSum(int num) {    /*    num为1时,方法返回1,    相当于是方法的出口,num总有是1的情况    */    if(num == 1){    return 1;    }    /*    num不为1时,方法返回 num +(num-1)的累和    递归调用getSum方法    */    return num + getSum(num-1);}

递归求阶乘

阶乘:所有小于及等于该数的正整数的积。

分析:n的阶乘:n! = n * (n-1) ...3 * 2 * 1

//计算n的阶乘,使用递归完成public static void main(String[] args) {    int n = 3;    // 调用求阶乘的方法    int value = getValue(n);    // 输出结果    System.out.println("阶乘为:"+ value);}public static int getValue(int n) {    // 1的阶乘为1    if (n == 1) {    return 1;}    /*    n不为1时,方法返回 n! = n*(n-1)!    递归调用getValue方法    */    return n * getValue(n - 1);}

目录遍历

遍历目录下的所有文件和所有的子目录。

分析:目录遍历,无法判断多少级目录,所以在遍历需要进行判断,如果遍历到的还是目录,就要使用递归,遍历所有目录。

public static void main(String[] args){    // 创建File对象    show(new File("./").getAbsoluteFile());}public static void show(File dir) {    // 获取子文件和目录    File[] files = dir.listFiles();    // 循环打印    for (File file : files) {        //判断是文件,直接输出        if (file.isFile()) {            System.out.println(file);        } else {            // 是目录,继续遍历,形成递归            show(file);        }    }}

关键词: