Java: 从位于项目文件夹下的文件加载数据失败
Java: Loading data from a file located under project folder fails
我正在尝试读取一个.yaml
文件(位于我的项目文件夹下,不与下面的java文件在同一个包下) 通过使用 org.yaml.snake 库。
我的java源文件如下:
sample.java
private void readAndLoadFromConfigFile() {
Yaml yaml = new Yaml();
InputStream inputStream = null;
try {
inputStream = getClass().getResourceAsStream("config.yaml");
@SuppressWarnings("unchecked")
Map<String, Map<String, String>> values = (Map<String, Map<String, String>>) yaml.load(inputStream);
for (String key : values.keySet()) {
Map<String, String> subValues = values.get(key);
logger.info(key);
for (String subValueKey : subValues.keySet()) {
logger.info(String.format("\t%s = %s", subValueKey, subValues.get(subValueKey)));
}
}
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
和config.yaml是:
ip_addresses:
firstMachineAddress : '162.242.195.82'
secondMachineAddress : '50.31.209.229'
ports:
firstTargetPort : '4041'
secondTargetPort : '5051'
但是我得到 "stream closed" 异常。谁能发现问题?
编辑: 我添加了 @SuppressWarnings("unchecked")
,现在它显示 file not found
,这是一个不同的问题。我怀疑错误是路径问题,它找不到我的 config.yaml
。
任何人都可以提供有关如何引用项目文件夹下的文件的想法?
你需要走对路。
getClass().getResourceAsStream("...")
加载相对于当前 class 所在路径的文件(因为您使用 class 来查询资源)。因此,如果您的 class 位于名为 com.example.mypackage
的包中,并且您提供了一个字符串 "config.yaml"
,则将搜索该文件 相对于 class 包文件夹.
由于您使用 Maven,放置文件的正确方法是 src/main/resources/com/example/mypackage/config.yaml
。但是,如果你想让 yaml 文件直接位于 src/main/resources
,你必须使用 absolute 路径 "/config.yaml"
(absolute 在您的 JAR 上下文中,即)。
或者,可能更简洁,使用 class 加载器查询相对路径:
getClass().getClassLoader().getResourceAsStream("config.yaml");
这将与 config.yaml 一起 src/main/resources
。
我正在尝试读取一个.yaml
文件(位于我的项目文件夹下,不与下面的java文件在同一个包下) 通过使用 org.yaml.snake 库。
我的java源文件如下:
sample.java
private void readAndLoadFromConfigFile() {
Yaml yaml = new Yaml();
InputStream inputStream = null;
try {
inputStream = getClass().getResourceAsStream("config.yaml");
@SuppressWarnings("unchecked")
Map<String, Map<String, String>> values = (Map<String, Map<String, String>>) yaml.load(inputStream);
for (String key : values.keySet()) {
Map<String, String> subValues = values.get(key);
logger.info(key);
for (String subValueKey : subValues.keySet()) {
logger.info(String.format("\t%s = %s", subValueKey, subValues.get(subValueKey)));
}
}
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
和config.yaml是:
ip_addresses:
firstMachineAddress : '162.242.195.82'
secondMachineAddress : '50.31.209.229'
ports:
firstTargetPort : '4041'
secondTargetPort : '5051'
但是我得到 "stream closed" 异常。谁能发现问题?
编辑: 我添加了 @SuppressWarnings("unchecked")
,现在它显示 file not found
,这是一个不同的问题。我怀疑错误是路径问题,它找不到我的 config.yaml
。
任何人都可以提供有关如何引用项目文件夹下的文件的想法?
你需要走对路。
getClass().getResourceAsStream("...")
加载相对于当前 class 所在路径的文件(因为您使用 class 来查询资源)。因此,如果您的 class 位于名为 com.example.mypackage
的包中,并且您提供了一个字符串 "config.yaml"
,则将搜索该文件 相对于 class 包文件夹.
由于您使用 Maven,放置文件的正确方法是 src/main/resources/com/example/mypackage/config.yaml
。但是,如果你想让 yaml 文件直接位于 src/main/resources
,你必须使用 absolute 路径 "/config.yaml"
(absolute 在您的 JAR 上下文中,即)。
或者,可能更简洁,使用 class 加载器查询相对路径:
getClass().getClassLoader().getResourceAsStream("config.yaml");
这将与 config.yaml 一起 src/main/resources
。