Java:使用Files.write()在Jar文件所在目录创建文件的问题
解决Jar文件所在目录创建文件的问题
这个问题我之前踩过坑!你遇到的核心问题是:用相对路径"Test.txt"时,Java会把它解析成终端启动时的当前工作目录,而不是Jar文件实际所在的目录。下面给你两个靠谱的解决思路:
方法一:直接获取Jar文件的绝对路径构建目标文件
通过主类的保护域获取Jar的位置,再拼接目标文件名,这样就能确保文件创建在Jar所在目录:
import java.io.File; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class YourMainClass { public static void main(String[] args) { try { // 获取Jar文件的绝对路径 File jarFile = new File(YourMainClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()); // 获取Jar所在的目录 String jarDirectory = jarFile.getParent(); // 构建Test.txt的完整路径 String testFilePath = Paths.get(jarDirectory, "Test.txt").toString(); // 写入文件 Files.write(Paths.get(testFilePath), "foo.txt".getBytes(), StandardOpenOption.CREATE); } catch (URISyntaxException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
方法二:利用ClassLoader获取Jar目录(兼容更多场景)
如果你的程序有复杂的类加载场景,也可以用ClassLoader来获取Jar位置,逻辑和方法一类似:
import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class YourMainClass { public static void main(String[] args) { try { // 通过ClassLoader获取Jar的URL URI jarUri = YourMainClass.class.getClassLoader().getResource("").toURI(); File jarDir = new File(jarUri); // 注意:如果Jar是被解压运行的,这里可能需要调整,不过java -jar启动时没问题 String testFilePath = Paths.get(jarDir.getAbsolutePath(), "Test.txt").toString(); Files.write(Paths.get(testFilePath), "foo.txt".getBytes(), StandardOpenOption.CREATE); } catch (URISyntaxException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
注意事项
- 记得处理
URISyntaxException和IO异常,实际项目里最好加上更完善的错误处理逻辑; - 确保Jar所在目录有写入权限,否则会抛出权限相关的异常;
- 如果你的Jar是被其他程序(比如容器)解压后运行的,可能需要调整路径获取方式,但
java -jar直接启动的场景下,上面的方法完全适用。
内容的提问来源于stack exchange,提问作者pascal0506
相关产品推荐
相关产品推荐

