【Java杂记】文件操作:如何获取文件绝对路径?

"本文介绍了在Java中获取当前项目绝对路径以及当前类字节码文件路径的两种方式,包括使用`System.getProperty("user.dir")`和`File`类的方法。同时,展示了如何通过URL获取类的资源路径,并提供了扫描指定包获取所有类全名的实现思路,涉及递归遍历文件夹和处理类文件。内容适合Java开发者学习和参考。"
摘要由CSDN通过智能技术生成

1.获取当前项目的绝对路径

我们来获取 myJdkDynamic 这个项目的绝对路径

在这里插入图片描述
这里可以使用系统参数 user.dir

String absolutePath = System.getProperty("user.dir");
System.out.println(absolutePath); 
// C:\Users\13275\Documents\Java\Java-project\myJdkDynamic

另外,还可以通过 File 来获取

File f = new File("");
String absolutePath = f.getAbsolutePath()
System.out.println(absolutePath); 
// C:\Users\13275\Documents\Java\Java-project\myJdkDynamic

File f = new File(".");
String absolutePath = f.getCanonicalPath()
System.out.println(absolutePath); 
// C:\Users\13275\Documents\Java\Java-project\myJdkDynamic

2.获取当前类(class 字节码文件)绝对路径

我们来获取 myJdkDynamic 项目中,Test.class 的绝对路径:

在这里插入图片描述

这里可以通过 URL 类来获取

URL resource = Test.class.getResource("");
String absolutePath = resource.getPath();
System.out.println(absolutePath);
// /C:/Users/13275/Documents/Java/Java-project/myJdkDynamic/target/classes/com/yzh/test/

// 注:如果是 getResource("/"),拿到的则是类路径
// /C:/Users/13275/Documents/Java/Java-project/myJdkDynamic/target/classes/   

然后,我们就可以创建文件夹的 File 对象,去进行文件操作了。

注:Linux 下文件目录是 /,而 Windows 是 \,但创建 File 对象时,两者都可以作为入参。

1)我们现在已经有当前类所在目录的 File 对象了,如果我们要进一步,拿到某个 .class 文件的 File 对象,比如上面的 Test.class,

可以这样做:

// public File(File parent, String child)
File classFile = new File(classPathFile, "Test.class");

2)再进一步,扫描指定包,得到指定包下所有类的全类名(本质是文件操作)

大致步骤如下:

  1. 获取 scanPackage 的绝对路径,因为构建 File 的入参不能是包名(比如 com.yzh.test)
  2. 创建需要扫描包(目录)的 File 对象
  3. 递归遍历当前目录
private List<String> classNames = new ArrayList<String>();

// 入参 scanPackage 比如 com.yzh.test
private void doScanner(String scanPackage) {

    // getResource 获取绝对路径,首先要将包名转化成项目相对路径
    // 由于是包名,是相对于项目根目录而言的,所以在转化为 / 后还需要在最前面加上 /
    URL url = this.getClass().getClassLoader().getResource("/" + scanPackage.replaceAll("\\.", "/"));
    File classpath = new File(url.getFile()); // getFile 拿到绝对路径

    // 遍历文件夹,寻找class文件
    for (File file : classpath.listFiles()) {
        if (file.isDirectory()) {
            // 这里是通过递归遍历文件夹,还是包就再执行上述步骤(解析路径->创建目录->遍历)
            doScanner(scanPackage + "." + file.getName());
        } else {
            // 不是class文件的不管
            if (!file.getName().endsWith("class")) {continue;}
            // 这里要保存全类名(包.类名),因为后面要通过反射Class.forName获取Class对象
            String className = (scanPackage + "." + file.getName()).replace(".class", "");
            classNames.add(className);
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A minor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值