获取Java程序运行的路径

    科技2022-08-18  98

    中孚信息校招笔试遇到的

     

    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。

    Processed: 0.021, SQL: 9