修改Eclipse/Repast Simphony临时目录至外部盘后本地路径失效求助
问题原因与解决办法
为啥相对路径会失效?
当你用-Djava.io.tmpdir把临时目录改到F盘后,Repast Simphony启动时会自动把当前工作目录切到这个临时文件夹(也就是F:/repast_simphony_runs_tmp)。这时候你代码里写的./data/ParamFile.JSON5,系统会去F盘的临时目录下找这个路径,而不是你原来C盘模型目录里的data文件夹,自然找不到文件。
绝对路径为啥也找不到?
绝对路径按理说不该受临时目录影响,出现这种情况基本是两个原因:
- 权限坑:外部驱动器的权限设置可能让JVM的运行权限变了——比如你之前正常运行时是普通权限,改了临时目录后触发了UAC限制,导致进程读不了C盘的文件。
- Repast的路径解析搞事情:Repast Simphony的部分文件处理模块可能会多此一举,把你写的绝对路径当成相对路径,拼到临时目录后面,最后变成
F:/repast_simphony_runs_tmp/C:/Users/Username/RepastModel/data/ParamFile.JSON5这种四不像的路径,肯定找不到。
解决办法
搞定相对路径
别用相对路径了,要么直接写死模型所在的绝对路径,要么用代码动态拿模型的真实根目录:
// 方式1:用类加载器获取资源的绝对路径(推荐,不受工作目录影响) URL resource = getClass().getResource("/data/ParamFile.JSON5"); String json5Path = new File(resource.toURI()).getAbsolutePath(); // 方式2:如果知道模型根目录,直接写绝对路径 String json5Path = "C:/Users/Username/RepastModel/data/ParamFile.JSON5";
修复绝对路径问题
- 先试管理员权限运行Eclipse:右键Eclipse图标选“以管理员身份运行”,再启动模型,排除权限限制的锅。
- 加日志看真实路径:在代码里打个日志,看看实际读取的路径是不是被拼错了:
String json5Path = "C:/Users/Username/RepastModel/data/ParamFile.JSON5"; System.out.println("实际读取路径:" + json5Path); File file = new File(json5Path); System.out.println("文件存在吗?" + file.exists());
如果输出的路径是临时目录+绝对路径的拼接版,那直接用File类创建绝对路径的对象,绕开Repast的路径解析逻辑就行。
临时目录设置的注意点
设置-Djava.io.tmpdir时,确保路径格式对(Windows用/或者\\),而且目标文件夹已经建好,读写权限也够:
-Djava.io.tmpdir=F:/repast_simphony_runs_tmp
内容的提问来源于stack exchange,提问作者WLeo
相关产品推荐
相关产品推荐

