java — File类和递归

File类

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

静态常量

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

绝对路径和相对路径

  • 绝对路径:从盘符(Windows)或"/"(Linux)开始的路径,这是一个完整的路径,绝对路径具有唯一性
  • 相对路径:相对于某个目录的路径,这是一个便捷的路径,开发中经常使用,java中写的相对路径, 一般都是相对于当前项目
// Windows绝对路径 Windows
String 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() // 获取文件字节数, 不存在返回0
public 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());

// 获取文件字节数, 不存在返回0
long 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()
// 判断路径是否存在, 存在返回true

public boolean isFile()
// 判断是否为文件 文件返回true, 目录返回false, 路径不存在也返回false

public boolean isDirectory()
// 判断是否为目录, 目录返回true, 文件返回false, 路径不存在也返回false
// 判断路径是否存在, 存在返回true
System.out.println(new File("FileClass/test/NewDir1").exists());

// 判断是否为文件 文件返回true, 目录返回false, 路径不存在也返回false
System.out.println(file6.isFile());

// 判断是否为目录, 目录返回true, 文件返回false, 路径不存在也返回false
System.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, 失败返回false
System.out.println(file6.createNewFile());

// 创建目录, 成功返回true, 失败返回false
System.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);
        }
    }
}

原文链接:https://www.cnblogs.com/paopaoT/p/17323917.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java — File类和递归 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • java工程师进阶之MyBatis延迟加载的使用

    Java工程师进阶之MyBatis延迟加载的使用攻略 MyBatis是Java中常用的一款ORM框架,它能够简化Java与关系型数据库的交互,提高工作效率。MyBatis在优化查询性能方面表现尤为突出,其中延迟加载技术尤为重要。本篇攻略将重点介绍MyBatis中的延迟加载技术的使用方法及技巧。 什么是MyBatis的延迟加载 MyBatis的延迟加载(Laz…

    Java 2023年5月20日
    00
  • java 截取字符串(判断汉字)

    下面为你详细讲解Java截取字符串的攻略。 什么是字符串截取? 在Java中,字符串截取就是从一个源字符串中获取指定的一段子字符串。常见的应用场景包括翻译、搜索、字符串处理等。 字符串截取的方法 Java中有两种方法可以截取字符串,分别是substring()和subSequence()方法。 substring()方法 该方法的使用格式为: String …

    Java 2023年5月27日
    00
  • java中main函数你知道多少

    下面是关于“java中main函数”的详细讲解攻略: 什么是main函数 在Java语言中,main函数是一个特殊的函数,是程序的入口,也是程序开始执行的地方。每个Java程序都需要有一个main函数,没有main函数的程序是无法运行的。main函数的定义如下: public static void main(String[] args) { // 程序代码…

    Java 2023年5月23日
    00
  • 教你用Java验证服务器登录系统

    下面是教你用 Java 验证服务器登录系统的完整攻略。 1. 了解登录系统的流程 在开始编写验证服务器登录系统的程序之前,我们需要了解登录系统的流程。一般来说,登录系统的流程包含以下几个步骤: 用户在客户端界面输入用户名和密码。 客户端将用户输入的用户名和密码打包成请求发给服务器。 服务器验证用户名和密码是否正确。 如果用户名和密码正确,服务器就会在数据库中…

    Java 2023年5月24日
    00
  • Struts2实现文件上传功能实例解析

    让我给你详细讲解一下“Struts2实现文件上传功能实例解析”的完整攻略。 1. 导入相关依赖 首先,我们需要在项目的pom.xml文件中导入相关依赖: <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileuplo…

    Java 2023年5月20日
    00
  • 可以关闭计算机的js脚本

    针对“可以关闭计算机的js脚本”的问题,我会给出以下详细讲解。 什么是可以关闭计算机的JS脚本? 可以关闭计算机的JS脚本是指可以通过JS代码执行来关闭计算机的技术手段。它能够在浏览器上执行JS代码,从而实现强制关闭电脑等行为。这种脚本不仅具有破坏性,而且对受害者的电脑资料造成威胁。 如何编写可以关闭电脑的JS脚本? 为了编写可以关闭电脑的JS脚本,我们需要…

    Java 2023年6月15日
    00
  • Java实现万年历效果

    下面是“Java实现万年历效果”的完整攻略。 准备工作 在实现万年历之前,需要先了解一些基本知识: Java 的日期类 Date、Calendar 和 LocalDate Java 的输入输出流,包括 Scanner 和 System.out Java 的字符串拼接和格式化输出 模块化编程及测试方法 实现步骤 接下来就可以开始实现万年历了。 步骤1:获取用户…

    Java 2023年5月19日
    00
  • MyEclipse怎么设置性能才能达到最佳?

    MyEclipse是一款集成开发环境(IDE),使用该IDE能够为Java开发提供有效的工具和特性。MyEclipse有许多内置功能和选项,可以调整各种配置以提高性能和效率。以下是设置MyEclipse性能的攻略: 1. 显式地配置JVM MyEclipse是基于Java开发的IDE,其虚拟机运行在Java虚拟机上(JVM)。了解和调整JVM设置是提高性能的…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部