Java Socket电商项目资源包文件读写同步问题咨询
问题分析与解决方案
你遇到的核心问题是源码目录(server模块的resources)和编译输出目录(out)的文件不同步:
resources属于项目源码目录,编译时IDE会自动把这里的文件复制到out(或target)的类路径下;而程序运行时,getResource/getResourceAsStream实际访问的是out目录里的文件副本,所以你写入的是out里的文件,源码resources目录中的原文件不会被IDE自动同步更新。
解决方案1:更换存储目录(最推荐)
不要把需要读写的文件放在resources目录中,直接在项目根目录下新建一个data文件夹专门存储这类可读写的文件,这样读写路径统一,也不会和编译输出文件混淆。
修改后的读写代码示例:
// 读取文件 public void openForReading(String dataSource) throws FileNotFoundException { File file = new File("data/" + dataSource); reader = new BufferedReader(new FileReader(file)); } // 写入文件 public void openForWriting(String dataSource) throws IOException { File file = new File("data/" + dataSource); // 自动创建父目录(如果data文件夹不存在则生成) file.getParentFile().mkdirs(); writer = new PrintWriter(new BufferedWriter(new FileWriter(file))); }
解决方案2:手动同步(临时测试用)
如果只是临时测试需求,可以手动将out目录中修改后的txt文件复制回server模块的resources目录。但该方法重复操作多,不适合长期开发场景。
解决方案3:IDE自动同步(不推荐)
如果坚持要使用resources目录,以IDEA为例可配置自动同步:
- 打开
File → Settings → Build, Execution, Deployment → Compiler,勾选「Build project automatically」 - 按
Ctrl+Shift+A打开「Find Action」,输入「Registry」,找到compiler.automake.allow.when.app.running并勾选
但该方法存在同步延迟,且运行时频繁编译同步可能拖慢程序性能,仅适合临时场景。
内容的提问来源于stack exchange,提问作者Kaja S.
相关产品推荐
相关产品推荐

