如何从Java中的文件资源加载资源包?

47 java resourcebundle

我有一个名为mybundle.txtc:/temp-

c:/temp/mybundle.txt

如何将此文件加载到java.util.ResourceBundle?该文件是有效的资源包.

这似乎不起作用:

java.net.URL resourceURL = null;

String path = "c:/temp/mybundle.txt";
java.io.File fl = new java.io.File(path);

try {
   resourceURL = fl.toURI().toURL();
} catch (MalformedURLException e) {             
}           

URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{resourceURL});
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle( path , 
                java.util.Locale.getDefault(), urlLoader );
Run Code Online (Sandbox Code Playgroud)

For*_*e_7 62

只要您正确命名资源包文件(扩展名为.properties),就可以了:

File file = new File("C:\\temp");
URL[] urls = {file.toURI().toURL()};
ClassLoader loader = new URLClassLoader(urls);
ResourceBundle rb = ResourceBundle.getBundle("myResource", Locale.getDefault(), loader);
Run Code Online (Sandbox Code Playgroud)

其中"c:\ temp"是包含属性文件的外部文件夹(不在类路径上),"myResource"与myResource.properties,myResource_fr_FR.properties等相关.

感谢http://www.coderanch.com/t/432762/java/java/absolute-path-bundle-file


Jon*_*eet 44

当你说它是"有效的资源包"时 - 它是属性资源包吗?如果是这样,最简单的加载方式可能是:

try (FileInputStream fis = new FileInputStream("c:/temp/mybundle.txt")) {
  return new PropertyResourceBundle(fis);
}
Run Code Online (Sandbox Code Playgroud)

  • 而不是(与IE浏览器`FileInputStream`)手动加载文件和构建`ProperyResourceBundle`,should't"正道"是使用`ResourceBundle.getBundle(...)`方法? (8认同)
  • @Vihung`ResourceBundle.getBundle()`将从类路径加载资源包并使用给定的Locale.不是OP期望的"原始"文件. (4认同)
  • 没有迹象表明他实际上有多个文件.事实上,它有一个.txt后缀并不是非常令人鼓舞.但是,是的,在那种情况下会失败. (3认同)
  • 嘿乔恩,这是否错过了本地化问题,而这正是使用捆绑包的主要原因? (2认同)

Lud*_*ton 21

1)将扩展名更改为属性(例如mybundle.properties.)
2)将文件放入jar中并将其添加到类路径中.
3)使用以下代码访问属性:

ResourceBundle rb = ResourceBundle.getBundle("mybundle");
String propertyValue = rb.getString("key");
Run Code Online (Sandbox Code Playgroud)

  • 属性文件不必位于 JAR 中。如果类在包 `abcMyClass.java` 中,那么 `mybundle.properties` 必须在 `a` 的 *parent* 文件夹中,这将是类路径。即对于类`/myproject/a/b/c/MyClass.java`,资源包必须放在`/myproject/mybundle.properties`中。 (2认同)

Nic*_*olt 11

来自JavaDocs ResourceBundle.getBundle(String baseName):

baseName - 资源包的基本名称,完全限定的类名

这意味着简单的英语是资源包必须在类路径上,并且baseName应该是包含bundle和包名称的包,mybundle在你的情况下.

不要使用扩展名和构成包名称一部分的任何语言环境,JVM将根据默认语言环境为您排序 - 有关详细信息,请参阅java.util.ResourceBundle上的文档.


nob*_*ies 7

对于JSF应用程序

从给定的文件路径获取资源包prop文件以在JSF应用程序中使用它们.

  • 使用URLClassLoader设置包,以扩展ResourceBundle以从文件路径加载包.
  • 在tag的basename属性中指定类loadBundle. <f:loadBundle basename="Message" var="msg" />

有关扩展RB的基本实现,请参阅样本定制资源包中的示例

/* Create this class to make it base class for Loading Bundle for JSF apps */
public class Message extends ResourceBundle {
        public Messages (){
                File file = new File("D:\\properties\\i18n");  
                ClassLoader loader=null;
                   try {
                       URL[] urls = {file.toURI().toURL()};  
                       loader = new URLClassLoader(urls); 
                       ResourceBundle bundle = getBundle("message", FacesContext.getCurrentInstance().getViewRoot().getLocale(), loader);
                       setParent(bundle);
                       } catch (MalformedURLException ex) { }
       }
      .
      .
      .
    }
Run Code Online (Sandbox Code Playgroud)

否则,从getBundle方法获取bundle,但从其他源获取locale,Locale.getDefault()在这种情况下可能不需要new(RB)类.


Joh*_*ohn 5

如果像我一样,您实际上想从文件系统而不是类路径加载 .properties 文件,但保留与查找相关的所有智能,请执行以下操作:

  1. 创建一个子类java.util.ResourceBundle.Control
  2. 重写该newBundle()方法

在这个愚蠢的示例中,我假设您有一个文件夹,其中C:\temp包含“.properties”文件的平面列表:

public class MyControl extends Control {
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
        throws IllegalAccessException, InstantiationException, IOException {

    if (!format.equals("java.properties")) {
        return null;
    }

    String bundleName = toBundleName(baseName, locale);
    ResourceBundle bundle = null;

    // A simple loading approach which ditches the package      
    // NOTE! This will require all your resource bundles to be uniquely named!
    int lastPeriod = bundleName.lastIndexOf('.');

    if (lastPeriod != -1) {
        bundleName = bundleName.substring(lastPeriod + 1);
    }
    InputStreamReader reader = null;
    FileInputStream fis = null;
    try {

        File file = new File("C:\\temp\\mybundles", bundleName);

        if (file.isFile()) { // Also checks for existance
            fis = new FileInputStream(file);
            reader = new InputStreamReader(fis, Charset.forName("UTF-8"));
            bundle = new PropertyResourceBundle(reader);
        }
    } finally {
        IOUtils.closeQuietly(reader);
        IOUtils.closeQuietly(fis);
    }
    return bundle;
}
Run Code Online (Sandbox Code Playgroud)

}

另请注意,这支持 UTF-8,我相信默认情况下不支持 UTF-8。