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

可运行JAR文件中通过代码保存PNG文件报路径不存在如何解决

问题根因
  • Eclipse中运行项目时,程序工作目录就是项目根文件夹,磁盘上真实存在src/GuiServerScreens源码目录,所以拼接的路径有效,功能可以正常运行。
  • 导出为Runnable JAR包后,src下的所有源码、资源都会被压缩进JAR文件内部,磁盘上不会保留独立的src目录。你把JAR放在桌面运行时,user.dir取值为桌面路径,拼接出来的C:\Users\Ilya\Desktop\src\GuiServerScreens\在磁盘上完全不存在,自然抛出路径找不到的异常。
  • 注意:JAR包内部的资源是只读的,即便你能定位到JAR包内的GuiServerScreens路径,也无法直接写入新文件,永远不要尝试往运行中的JAR包内部写上传的用户文件。
修复方案

直接替换原有路径逻辑即可,核心是三点:一是放弃依赖src源码目录做文件存储,二是写入文件前自动创建不存在的父目录,三是兼容跨系统路径规则。
修正后的可运行代码:

private static void getImg(MyFile msg) {
    int fileSize = msg.getSize();
    System.out.println("file length: " + fileSize);
    // 存储目录设为程序运行目录下的独立图片文件夹,和源码、JAR包解耦
    // 用File.separator代替硬编码的\\,自动适配Windows/macOS/Linux的路径分隔符
    File imgStoreDir = new File(System.getProperty("user.dir"), "GuiServerScreens");
    // 目录不存在时递归创建所有父级目录,从根源避免路径不存在报错
    if (!imgStoreDir.exists()) {
        imgStoreDir.mkdirs();
    }
    File newFile = new File(imgStoreDir, msg.getFileName());
    // 用try-with-resources语法自动关闭流,无需手动flush、close,避免资源泄漏
    try (FileOutputStream fileOut = new FileOutputStream(newFile);
         BufferedOutputStream bufferOut = new BufferedOutputStream(fileOut)) {
        bufferOut.write(msg.getMybytearray(), 0, fileSize);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

额外优化建议:

  • 生产环境部署时,建议把图片存储路径写到配置文件中,不要硬编码在代码里,后续迁移存储位置、做备份时不需要重新打包代码。
  • 文件名建议做重名校验,避免不同用户上传同名文件时覆盖原有文件。

内容的提问来源于stack exchange,提问作者Soske

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:45:53