我有一个包含几个模块的java项目:
myWebApp
- conf //not a java module, just text files
- ModuleA
-- src
-- target
-- moduleA.iml
-- pom.xml
- ModuleB
...
- pom.xml
- myWebApp.iml
- myWebApp.env
我想从Class(显然位于模块的src文件夹下)访问myWebApp.env
文件(这是一个java属性文件),如:
InputStream is = new FileInputStream(<RelativePathToEnvFile>);
问题是相对路径似乎只适用于模块下的子目录。使用所提到的here
的getResource()技巧来源root或类路径内的任何地方在其他所有语言中,我知道我可以做类似的事情:
InputStream is = new FileInputStream("../../../../../myWebApp.env");
这在Java中不可能吗?
答案 0 :(得分:4)
从Java 7开始,您可以使用NIO Files API执行此操作(旧的File API也可以使用,但使用NIO可以更好地完成相对路径分辨率)
File file = Paths.get("../../pom.xml").toFile();
为确保文件正确,您可以调用toRealPath()
来解析相对路径段
File file = Paths.get("../../pom.xml").toRealPath().toFile();
如果你有一个工作目录,你可以从中解决相对路径:
File file = Paths.get(".") //the current working dir
.resolve("../pom.xml") //navigate to a relative path
.toFile(); //convert to old File api
使用IDE时,您必须确保工作目录正确无误。工作目录不一定是执行类所属的同一模块目录。工作目录可以是项目/父模块的目录。
此外,您的代码可能仅适用于该特定设置。至少你应该考虑将env文件放在你的一个模块的resources文件夹中(或者有一个单独的配置模块),然后在类路径中解析该文件。