获取Java程序运行的路径

本文主要介绍了在Java中如何获取类路径以及使用类加载器和类来定位资源。作者通过示例代码展示了`System.getProperty(java.class.path)`和`Class.getClassLoader().getResource()`方法的区别,并解释了它们在查找资源时的不同行为。文章还强调了在处理资源路径时应注意的细节,如路径前缀、类的全名和包名的转换等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中孚信息校招笔试遇到的

 

import java.io.File;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.*;


/**
 * @Author: 软件171 邱忠玉 201707163
 * @Date: 2020/9/20 10:04
 */
public class Main {


    public static void main(String[] args) {

        //第一种方式
        System.out.println(System.getProperty("java.class.path"));

        //第二种方式(利用类加载器)
        String realPath = getRealPath(Main.class);
        System.out.println(realPath);


    }

    public static String getRealPath(Class clazz) {

        //判断是否为空
        Class aClass = Optional.of(clazz).orElseThrow(() -> new IllegalArgumentException("参数不能为空!"));


        //获得类加载器
        ClassLoader classLoader = aClass.getClassLoader();

        //获得类的全名,包括包名
        String clazzName = aClass.getName() + ".class";

        //获得该类所在的包名
        Package aPackage = aClass.getPackage();
        String packName = Optional.of(aPackage).map(Package::getName).filter(s -> !s.startsWith("java")).filter(s -> !s.startsWith("javax")).orElseThrow(() -> new IllegalArgumentException("不要传递系统类!"));


        //获得类的文件名
        String className = clazzName.substring(packName.length() == 0 ? 0 : packName.length() + 1);

        //将包名转化成相对路径
        String path = "";
        if (packName.equals("")) {
        } else if (!packName.contains(".")) {
            path = packName + File.separator;
        } else {
            path = path + packName.replaceAll(".", File.separator);
            path = path + File.separator;
        }


        //利用getResource得到当前的类文件所在URL
        URL url = classLoader.getResource(path + className);

        //利用URL解析出当前Java程序所在的路径
        String realPath = Optional.ofNullable(url).map((s) -> URLDecoder.decode(s.getPath().substring(1), StandardCharsets.UTF_8)).
                map(s -> s.substring(0, s.indexOf(className) - 1)).orElseThrow(() -> new RuntimeException("url解析失败!!"));

        return realPath;
    }


}

ps:理解class.getClassLoader().getResource()和class.getResource()区别

 

1. class.getClassLoader().getResource(String name)

 默认从classpath中找文件(文件放在resources目录下),name不能带“/”,否则会抛空指针

2. class.getResource(String name)

如果name以"/"开头,那么绝对路径是/后边跟的名字

如果name不是以"/"开头,那么绝对路径是package名"."换成“/”以后再加name。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值