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();
}
我不知道为什么,请你帮忙
问题在于,你试图加载一个不存在于应用程序知道的classpath中的bundle。
当你调用 ResourceBundle.getBundle
它将尝试从应用程序classpath加载资源包。但是应用程序的classpath在应用程序启动时就已经被定义了,所以你的全新文件没有在那里列出。
我想到了两个选择。从文件输入流中加载资源包 或者,定义你自己的classloader来加载文件。
1. 从文件输入流加载文件包
创建一个新的 PropertyResourceBundle
从 FileInputStream
直接加载每个文件。
警告:为了简洁起见,省略了流的关闭和异常处理。为了简洁起见,省略了流的关闭和异常处理。
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);
希望对大家有所帮助。