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

我在c:/temp有一个名为mybundle.txt的文件 –

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

只要你正确地命名你的资源包文件(使用.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”是持有属性文件的外部文件夹(不在类path中),而“myResource”涉及myResource.properties,myResource_fr_FR.properties等。

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

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

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

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

 ResourceBundle rb = ResourceBundle.getBundle("mybundle"); String propertyValue = rb.getString("key"); 

从JavaDocs for ResourceBundle.getBundle(String baseName)

baseName – 资源包的基本名称,一个完全限定的类名称

这在纯英文中意味着资源包必须位于类path中,并且baseName应该是包含捆绑包加上捆绑包名称(在您的情况下为mybundle的包。

离开扩展名和任何形成捆绑名称一部分的语言环境,JVM将根据默认语言环境为您sorting – 有关详细信息,请参阅java.util.ResourceBundle上的文档。

对于JSF应用程序

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

  • 使用URLClassLoader为扩展ResourceBundle以从文件path加载分发包的类设置分发包。
  • loadBundle标签的basename属性中指定类。 <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,如Locale.getDefault() ,在这种情况下新的(RB)类可能不需要。

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

  1. 创build一个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,我相信这是默认情况下不支持。

我宁愿使用resourceboundle类来加载属性 – 只是为了得到它在一行而不是5行代码通过stream,属性类和lo​​ad()。

FYI ….

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

我刚刚发布了一个名为Rincl的库,它将所有的苦工从资源文件加载中取出。 以类名命名的资源文件被自动find(使用正常的本地parsing)。 更好的是,自动find父类和接口的资源。 另外,它具有各种好处,例如透明地处理UTF-8属性文件和XML属性文件。

你也可以阅读一个介绍或完整的课程,使用Rincl 进行国际化。

我认为你想要文件的父级在类path上,而不是实际的文件本身。

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

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

文件名应该有.properties扩展名,基本目录应该在classpath中。 否则,它也可以放在类path中的jar中。相对于类path中的目录,可以使用/或指定资源束。 分隔器。 “” 是优选的。

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

这适用于我:

 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(); } } } 
 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); } } 
 ResourceBundle rb = ResourceBundle.getBundle("service"); //service.properties System.out.println(rb.getString("server.dns")); //server.dns=http://....