Java 8资源捆绑包无法找到立即创建的文件。

问题描述 投票:1回答:1
public class TestResourceBundle {
    private static final Path frZoo = Paths.get("./src/Zoo_fr.properties");
    private static final Path enZoo = Paths.get("./src/Zoo_en.properties");

    private static void createFiles() {

        try {
            Files.createFile(frZoo);
            Files.createFile(enZoo);

            try (BufferedWriter enWriter = Files.newBufferedWriter(enZoo);
                 BufferedWriter frWriter = Files.newBufferedWriter(frZoo);) {
                enWriter.write("hello=Hello\nopen=The zoo is open");
                frWriter.write("hello=Bonjour\nopen=Le zoo est ouvert");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void createBundle() {
        Locale us = new Locale("en", "US");
        Locale france = new Locale("fr", "FR");

        ResourceBundle usBundle = ResourceBundle.getBundle("Zoo", us);
        ResourceBundle frBundle = ResourceBundle.getBundle("Zoo", france);

        System.out.println(usBundle.getString("hello"));
        System.out.println(frBundle.getString("hello"));
    }
}

在主函数中,如果我运行以下内容,它将抛出java.util.MissingResourceException。

public static void main(String[] args) {
        createFiles();
        createBundle();
}

但如果我分别运行这两个函数(在两个程序中),它可以工作,而且没有任何问题。

首先运行

public static void main(String[] args) {
        createFiles();
        // createBundle();
}

然后运行下面的程序,在本例中,它的工作原理是

public static void main(String[] args) {
        // createFiles();
        createBundle();
}

我不知道为什么,请你帮忙

java resourcebundle
1个回答
1
投票

问题在于,你试图加载一个不存在于应用程序知道的classpath中的bundle。

当你调用 ResourceBundle.getBundle 它将尝试从应用程序classpath加载资源包。但是应用程序的classpath在应用程序启动时就已经被定义了,所以你的全新文件没有在那里列出。

我想到了两个选择。从文件输入流中加载资源包 或者,定义你自己的classloader来加载文件。

1. 从文件输入流加载文件包

创建一个新的 PropertyResourceBundleFileInputStream 直接加载每个文件。

警告:为了简洁起见,省略了流的关闭和异常处理。为了简洁起见,省略了流的关闭和异常处理。

FileInputStream enFileStream = new FileInputStream("./src/Zoo_en.properties");
FileInputStream frFileStream = new FileInputStream("./src/Zoo_fr.properties");

ResourceBundle usBundle = new PropertyResourceBundle(enFileStream);
ResourceBundle frBundle = new PropertyResourceBundle(frFileStream);

2. 创建一个URL ClassLoader来加载新文件。

这是一种更可扩展的方法。创建一个新的 URLClassLoader 并将该类加载器作为一个参数用于 getBundle.

警告:为了简洁起见,省略了流的关闭和异常处理。为简洁起见,省略了流的关闭和异常处理。

File bundleRootPath = new File("./src");
URL[] urls = new URL[]{bundleRootPath.toURI().toURL()};
ClassLoader classLoader = new URLClassLoader(urls);

ResourceBundle usBundle = ResourceBundle.getBundle("Zoo", us, classLoader);
ResourceBundle frBundle = ResourceBundle.getBundle("Zoo", france, classLoader);

希望对大家有所帮助。

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