可运行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
相关产品推荐
相关产品推荐

