我编写了一些配置类。 一切正常,但我的问题来了: 我使用 config.setString(bla bla bla) 然后 config.save(); 当我保存我的配置时,它出现在与我的 jar 文件相同的位置。 这就是我想看到的。但是当我重新启动我的程序时,我的配置将再次从 jar 中加载。如果文件不存在于与 jar 相同的文件夹中,我希望仅从 jar 本身加载配置。否则它应该加载“保存的文件”......
你能给我一些剪下来的代码吗?..我现在奋斗了很长时间
这是我目前加载它的方式:
private void loadYaml(InputStream inputStream, Map<String, Object> target, String pathPrefix) throws IOException {
Yaml yaml = new Yaml();
try (Reader reader = new BufferedReader(new InputStreamReader(inputStream))) {
Map<String, Object> yamlConfig = yaml.load(reader);
if (yamlConfig == null) {
throw new IllegalArgumentException("Invalid YAML syntax");
}
for (Map.Entry<String, Object> entry : yamlConfig.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof Map) {
// Recursively process nested maps
String nestedPath = pathPrefix.isEmpty() ? key : pathPrefix + "." + key;
loadYaml(new ByteArrayInputStream(yaml.dump(value).getBytes()), target, nestedPath);
} else {
// Construct the full path for this leaf value
String fullPath = pathPrefix.isEmpty() ? key : pathPrefix + "." + key;
// Store the value in the target map
target.put(fullPath, value);
}
}
}
}
public void load(String filePath) throws IOException {
ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(filePath);
String fileExtension = getFileExtension(filePath);
if (fileExtension.equals("yml") || fileExtension.equals("yaml")) {
loadYaml(inputStream, config, "");
} else {
loadPlainText(inputStream);
}
}
谢谢你们:)
要实现所需的行为,您可以修改加载方法以检查配置文件是否存在于与 jar 文件相同的文件夹中。如果文件存在,则从文件中加载配置,否则从 jar 中加载。这里有一些代码可以证明这一点:
public void load(String fileName) throws IOException {
File configFile = new File(fileName);
if (configFile.exists()) {
// If the config file exists, load it from the file
try (InputStream inputStream = new FileInputStream(configFile)) {
String fileExtension = getFileExtension(fileName);
if (fileExtension.equals("yml") || fileExtension.equals("yaml")) {
loadYaml(inputStream, config, "");
} else {
loadPlainText(inputStream);
}
}
} else {
// If the config file doesn't exist, load it from the jar
ClassLoader classLoader = getClass().getClassLoader();
try (InputStream inputStream = classLoader.getResourceAsStream(fileName)) {
if (inputStream == null) {
throw new FileNotFoundException("Config file not found: " + fileName);
}
String fileExtension = getFileExtension(fileName);
if (fileExtension.equals("yml") || fileExtension.equals("yaml")) {
loadYaml(inputStream, config, "");
} else {
loadPlainText(inputStream);
}
}
}
}
此代码使用
File.exists()
方法检查文件是否存在。如果该文件存在,它会使用 FileInputStream
从文件中加载配置。如果该文件不存在,它会使用 ClassLoader.getResourceAsStream()
方法从 jar 加载配置。