引
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 的绝对路径。