50

我有一个名为的mybundle.txt文件c:/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 );
4

14 回答 14

69

只要您正确命名资源包文件(使用 .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);

其中“c:\temp”是保存属性文件的外部文件夹(不在类路径上),“myResource”与 myResource.properties、myResource_fr_FR.properties 等相关。

归功于http://www.coderanch.com/t/432762/java/java/absolute-path-bundle-file

于 2013-03-27T08:35:54.617 回答
50

当你说它是“一个有效的资源包”时——它是一个属性资源包吗?如果是这样,加载它的最简单方法可能是:

try (FileInputStream fis = new FileInputStream("c:/temp/mybundle.txt")) {
  return new PropertyResourceBundle(fis);
}
于 2009-07-23T15:13:17.113 回答
21

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

ResourceBundle rb = ResourceBundle.getBundle("mybundle");
String propertyValue = rb.getString("key");
于 2009-09-09T16:41:09.567 回答
11

来自 JavaDocs ResourceBundle.getBundle(String baseName)

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

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

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

于 2009-07-23T15:14:04.320 回答
7

对于 JSF 应用程序

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

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

有关扩展 RB 的基本实现,请参阅Sample Customized Resource Bundle中的示例

/* 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) { }
       }
      .
      .
      .
    }

否则,从 getBundle 方法获取包,但从其他来源获取语言环境,例如Locale.getDefault(),新的 (RB) 类在这种情况下可能不需要。

于 2012-07-31T09:46:56.307 回答
4

如果像我一样,您确实想从文件系统而不是类路径加载 .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;
}

}

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

于 2011-07-25T16:37:48.763 回答
3

这对我很有用。而且它不会每次都重新加载捆绑包。我尝试获取一些统计信息以从外部文件位置加载和重新加载包。

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

其中“c:\temp”是保存属性文件的外部文件夹(不在类路径上),“myResource”与 myResource.properties、myResource_fr_FR.properties 等相关。

注意:如果你的类路径上有相同的包名,那么默认情况下会使用 URLClassLoader 的这个构造函数来获取它。

归功于http://www.coderanch.com/t/432762/java/java/absolute-path-bundle-file

在下面找到一些统计数据,所有时间都以毫秒为单位。我并不担心初始加载时间,因为这可能与我的工作区或我试图弄清楚的代码有关,但我试图展示的是重新加载的方式很少告诉我它来自内存。

这里有一些统计数据:

  • 初始 Locale_1 加载耗时 3486
  • 重新加载 Locale_1 花了 24
  • 重新加载 Locale_1 花了 23
  • 重新加载 Locale_1 花了 22
  • 重新加载 Locale_1 花了 15
  • 初始 Locale_2 加载耗时 870
  • 重新加载 Locale_2 花了 22
  • 重新加载 Locale_2 花了 18
  • 初始 Locale_3 加载耗时 2298
  • 重新加载 Locale_3 花了 8
  • 重新加载 Locale_3 花了 4
于 2018-06-25T21:27:19.240 回答
2

我更喜欢使用 resourceboundle 类来加载属性——只是为了在一行中完成它,而不是通过流、Properties 类和 load() 的 5 行代码。

供参考 ....

    public void init(ServletConfig servletConfig) throws ServletException {
    super.init(servletConfig);

    try {

            /*** Type1 */
        Properties props = new Properties();

        String fileName = getServletContext().getRealPath("WEB-INF/classes/com/test/my.properties");
    //          stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
    //          stream = ClassLoader.getSystemResourceAsStream("WEB-INF/class/com/test/my.properties");  

        InputStream stream = getServletContext().getResourceAsStream("/WEB-INF/classes/com/test/my.properties");

  //        props.load(new FileInputStream(fileName));
        props.load(stream);

        stream.close();
        Iterator keyIterator = props.keySet().iterator();
        while(keyIterator.hasNext()) {
                String key = (String) keyIterator.next();
                String value = (String) props.getProperty(key);
                System.out.println("key:" + key + " value: " + value);
        }

  /*** Type2:  */
  // Just get it done in one line by rb instead of 5 lines to load the properties
  // WEB-INF/classes/com/test/my.properties file            
  //            ResourceBundle rb = ResourceBundle.getBundle("com.test.my", Locale.ENGLISH, getClass().getClassLoader());
        ResourceBundle rb = ResourceBundle.getBundle("com.ibm.multitool.customerlogs.ui.nl.redirect");
        Enumeration<String> keys = rb.getKeys();
        while(keys.hasMoreElements()) {
            String key = keys.nextElement();
            System.out.println(key + " - " + rb.getObject(key));
        }
    } catch (IOException e) {
        e.printStackTrace();
        throw new ServletException("Error loading config.", e);
    } catch (Exception e) {
        e.printStackTrace();
        throw new ServletException("Error loading config.", e);
    }       

}
于 2012-05-31T22:37:58.233 回答
0
public class One {

    private static One one = null;

    Map<String, String> configParameter = Collections.synchronizedMap(new HashMap<String, String>());

    private One() {
        ResourceBundle rb = ResourceBundle.getBundle("System", Locale.getDefault());

        Enumeration en = rb.getKeys();
        while (en.hasMoreElements()) {
            String key = (String) en.nextElement();
            String value = rb.getString(key);
            configParameter.put(key, value);

        }
    }

    public static One getInstance() {
        if (one == null) {
            one= new One();
        }

        return one;

    }

    public Map<String, String> getParameter() {

        return configParameter;
    }



    public static void main(String[] args) {
        String string = One.getInstance().getParameter().get("subin");
        System.out.println(string);

    }
}
于 2014-05-30T19:58:37.097 回答
0

我认为您希望文件的级位于类路径上,而不是实际文件本身。

试试这个(可能需要一些调整):

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

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

URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{resourceURL});
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("mybundle.txt", 
                java.util.Locale.getDefault(), urlLoader );
于 2009-07-24T13:31:38.647 回答
0

如果您想加载不同语言的消息文件,只需使用 catalina.properties 的 shared.loader=... 了解更多信息,请访问http://theswarmintelligence.blogspot.com/2012/08/use-resource-bundle-消息文件-out.html

于 2012-08-20T12:36:18.090 回答
0

文件名应具有 .properties 扩展名,并且基目录应位于类路径中。否则,它也可以在类路径中的 jar 中相对于类路径中的目录,资源包可以用 / 或 指定。分隔器。“。” 是首选。

于 2010-11-22T15:22:46.663 回答
0

This works for me:

File f = new File("some.properties");
Properties props = new Properties();
FileInputStream fis = null;
try {
    fis = new FileInputStream(f);
    props.load(fis);
} catch (FileNotFoundException e) {
    e.printStackTrace();                    
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fis != null) {
        try {
            fis.close();
            fis = null;
        } catch (IOException e2) {
            e2.printStackTrace();
        }
    }
}           
于 2013-08-30T15:52:20.680 回答
0
ResourceBundle rb = ResourceBundle.getBundle("service"); //service.properties
System.out.println(rb.getString("server.dns")); //server.dns=http://....
于 2015-06-12T13:41:10.513 回答