You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:31:28