Java如何不指定固定目录读取jar包同目录下的文本文件?
实现Jar同目录文件定位
你现在写的new File("src/txtFile.txt")是开发阶段的临时路径,打包成Jar后根本不存在src这个目录结构,而且普通相对路径默认对齐的是JVM启动时的工作目录,和Jar实际存放在哪没有关系,发给用户之后大概率直接报文件找不到。
要实现不管用户把Jar和txt放在哪个目录,只要两个文件同目录就能正常读取,核心是先拿到Jar自身的存放路径,再拼接目标文件名,直接用下面的代码就行:
import java.io.File; import java.net.URISyntaxException; public class App { public static void main(String[] args) throws URISyntaxException { // 获取当前Jar包所在的绝对目录 File jarDir = new File( App.class.getProtectionDomain() .getCodeSource() .getLocation() .toURI() ).getParentFile(); // 定位同目录下的txtFile.txt File readFile = new File(jarDir, "txtFile.txt"); // 后面接你原来的文件读取逻辑就可以 } }
几个要注意的坑
- 别图省事直接写
new File("txtFile.txt"):这种写法的相对路径是跟着用户启动Jar时的终端位置走的,比如用户在下载文件夹根目录打开cmd,执行java -jar program/App.jar,程序会直接去下载文件夹根目录找txt,根本不会进program子目录,必然读不到文件。 - IDE本地调试的时候,上面的代码拿到的是项目编译输出目录(一般是
target/classes或者out/production/对应项目名),把测试用的txt文件丢到这个目录下就能正常调试,打包后逻辑会自动适配Jar所在目录,不需要改代码。 - 这个写法不依赖启动脚本,不管用户是敲命令启动、点bat脚本启动、还是通过快捷方式启动Jar,只要txt和Jar放在同一个文件夹下,就能准确定位到目标文件。
内容的提问来源于stack exchange,提问作者Miles
相关产品推荐
相关产品推荐

