Java: 访问任何模块外的相对路径
Java: Access relative path outside ANY module
我有一个 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>);
问题是相对路径似乎只适用于模块源根目录下的子目录,或者类路径中使用 getResource() 技巧的任何地方,如前所述 here
在我所知道的每一种其他语言上,我都可以这样做:
InputStream is = new FileInputStream("../../../../../myWebApp.env");
这在java中是不可能的吗?
从 Java 7 开始,您可以使用 NIO 文件 API 执行此操作(旧文件 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 时,您必须确保工作目录正确。工作目录不一定是与执行的 class 所属的模块目录相同的情况。工作目录可以是 project/parent 模块的目录。
此外,您的代码可能仅适用于该特定设置。至少你应该考虑将 env 文件放在你的模块之一的资源文件夹中(或者有一个单独的配置模块),然后在 classpath.
中解析文件
我有一个 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>);
问题是相对路径似乎只适用于模块源根目录下的子目录,或者类路径中使用 getResource() 技巧的任何地方,如前所述 here
在我所知道的每一种其他语言上,我都可以这样做:
InputStream is = new FileInputStream("../../../../../myWebApp.env");
这在java中是不可能的吗?
从 Java 7 开始,您可以使用 NIO 文件 API 执行此操作(旧文件 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 时,您必须确保工作目录正确。工作目录不一定是与执行的 class 所属的模块目录相同的情况。工作目录可以是 project/parent 模块的目录。
此外,您的代码可能仅适用于该特定设置。至少你应该考虑将 env 文件放在你的模块之一的资源文件夹中(或者有一个单独的配置模块),然后在 classpath.
中解析文件