Java8 资源包找不到立即创建的文件

Java 8 Resource Bundle cannot find file created immediately

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();
}

不知道为什么,求助

问题是您尝试加载的包不在应用程序知道的class路径中。

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

我能想到的两个选项:从文件输入流加载包,或者定义您自己的 classloader 来加载文件。

1.从文件输入流加载包

从直接加载每个文件的 FileInputStream 创建一个新的 PropertyResourceBundle

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

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 类加载器来加载新文件

这是一种更具可扩展性的方法。创建一个新的 URLClassLoader 并使用那个 class 加载程序作为 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);

希望对您有所帮助。