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);
希望对您有所帮助。
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);
希望对您有所帮助。