0
点赞
收藏
分享

微信扫一扫

【Java】本地开发环境正常、测试或生产环境获取的文件路径不对的问题

飞鸟不急 2023-11-10 阅读 45
java

Java 中经常获取本地文件或者resource下的文件,要获取文件,首先要获得本地路径。

Java 本身或一些开源工具包都提供了很多获取路径的方法。但使用时经常遇到本地开发环境正常、测试或生产环境获取的文件路径不对的问题。

本文将列出几种常见的获取本地文件的方法,并对比它们在打包前后的差异。

示例代码

package com.xzbd;

import java.io.File;

public final class Application {

    public static void main(String[] args) {
        System.out.println("测试 Java 获取本地文件路径:");

        System.out.println("【User Home 路径】:\r\n\t" + getUserHome());

        System.out.println("【User Dir 路径】:\r\n\t" + getUserDir());

        System.out.println("【Resource 路径】:\r\n\t" + getResourcePath());

        System.out.println("【Jar 路径】:\r\n\t" + getJarPath());

    }

    public static String getJarPath() {
        String jarPath = Application.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        return new File(jarPath).getAbsolutePath();
    }

    public static String getResourcePath() {
        String appPath = Application.class.getResource(File.separator).getPath();
        return new File(appPath).getAbsolutePath();
    }

    public static String getUserHome() {
        String userhome = System.getProperty("user.home");
        if (userhome == null) {
            return "";
        }
        return userhome;
    }

    public static String getUserDir() {
        String userdir = System.getProperty("user.dir");
        if (userdir == null) {
            return "";
        }
        return userdir;
    }

}

未打包前运行结果

PS D:\z_workspace\dirdemo>  & 'D:\apps\Java\jdk-17.0.7\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '-cp' 'D:\z_workspace\dirdemo\target\classes' 'com.xzbd.Application'
测试Java获取本地文件路径:
【User Home 路径】:
        D:\Users\74511
【User Dir 路径】:
        D:\z_workspace\dirdemo
【Resource 路径】:
        D:\z_workspace\dirdemo\target\classes\com\xzbd\%5c
【Jar 路径】:
        D:\z_workspace\dirdemo\target\classes
PS D:\z_workspace\dirdemo>

在这里插入图片描述

从上图最后一行可以看到,当前项目路径为 :D:\z_workspace\dirdemo

打包后运行结果

打包使用 Maven ,因为不是可运行 jar ,所以使用如下命令运行。
运行命令

D:\apps\Java\jdk-11.0.11\bin\java.exe -cp .\dirdemo-1.0.0.jar com.xzbd.Application 

执行结果

PS D:\z_workspace\dirdemo\target>
PS D:\z_workspace\dirdemo\target> D:\apps\Java\jdk-11.0.11\bin\java.exe -cp .\dirdemo-1.0.0.jar com.xzbd.Application 
测试 Java 获取本地文件路径:
【User Home 路径】:
        D:\Users\74511
【User Dir 路径】:
        D:\z_workspace\dirdemo\target
获取不到 resource目录
【Resource 路径】:

【Jar 路径】:
        D:\z_workspace\dirdemo\target\dirdemo-1.0.0.jar
PS D:\z_workspace\dirdemo\target>

结果

  • user home: 两种方式获得的路径一致
  • user dir:两种方式获得的路径不一致,但都是运行程序当前触发的路径
  • resource路径: 两种方式不一致,使用时慎重,要测试
  • jar 路径: 两种方式不一致。未打包前目录是编译后class文件所在的根目录 target。打包后获取到了 jar 的绝对路径。
举报

相关推荐

0 条评论