如果退出,从 jar 位置加载 config.yml?

问题描述 投票:0回答:1

我编写了一些配置类。 一切正常,但我的问题来了: 我使用 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);
        }
    }

谢谢你们:)

java yaml config
1个回答
0
投票

要实现所需的行为,您可以修改加载方法以检查配置文件是否存在于与 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 加载配置。

© www.soinside.com 2019 - 2024. All rights reserved.