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 );
リソースバンドルファイルに(.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 へのクレジット
「有効なリソースバンドル」と言うとき、それはプロパティリソースバンドルですか?もしそうなら、おそらくそれをロードする最も簡単な方法:
try (FileInputStream fis = new FileInputStream("c:/temp/mybundle.txt")) {
return new PropertyResourceBundle(fis);
}
1)拡張子をプロパティに変更します(例:mybundle.properties)。
2)ファイルをjarに入れて、クラスパスに追加します。
3)次のコードを使用してプロパティにアクセスします。
ResourceBundle rb = ResourceBundle.getBundle("mybundle");
String propertyValue = rb.getString("key");
ResourceBundle.getBundle(String baseName)
のJavaDocsから:
baseName
-リソースバンドルのベース名、完全修飾クラス名
これが平易な英語で意味することは、リソースバンドルがクラスパス上にある必要があり、baseName
はバンドルとバンドル名を含むパッケージである必要があることです。あなたの場合はmybundle
.
拡張機能とバンドル名の一部を形成するロケールを省略すると、JVMはデフォルトロケールに従ってソートします。詳細については、 Java.util.ResourceBundle のドキュメントを参照してください。
JSFアプリケーションの場合
特定のファイルパスからリソースバンドルpropファイルを取得して、JSFアプリで使用するため。
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)クラスは必要ない場合があります。
私のように、実際にはクラスパスではなくファイルシステムから.propertiesファイルをロードしたいが、ルックアップに関連するすべてのスマートを保持したい場合は、次の手順を実行します。
Java.util.ResourceBundle.Control
のサブクラスを作成します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クラスを使用してプロパティを読み込むことをお勧めします-ストリーム、Propertiesクラス、およびload()を介して5行のコードではなく、1行で実行するだけです。
ご参考までに ....
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);
}
}
これは非常にうまくいきました。そして、毎回バンドルをリロードするわけではありません。外部ファイルの場所からバンドルをロードおよびリロードするために、いくつかの統計情報を取得しようとしました。
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 へのクレジット
ミリ秒単位ですべての時間を以下の統計のいくつかを見つけます。最初の読み込み時間は、ワークスペースやコードで把握しようとしているものである可能性があるので心配していませんが、表示しようとしているのは、メモリからの読み込みを通知するリロードが少なくなったことです。
ここにいくつかの統計があります:
これは私のために働く:
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();
}
}
}
ファイルの親を実際のファイル自体ではなく、クラスパスに配置する必要があると思います。
これを試してください(微調整が必要な場合があります):
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 );
ResourceBundle rb = ResourceBundle.getBundle("service"); //service.properties
System.out.println(rb.getString("server.dns")); //server.dns=http://....
異なる言語のメッセージファイルをロードする場合は、catalina.propertiesのshared.loader =を使用してください...詳細については、 http://theswarmintelligence.blogspot.com/2012/08/use-をご覧ください。 resource-bundle-messages-files-out.html
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);
}
}
ファイル名の拡張子は.propertiesで、ベースディレクトリはクラスパスにある必要があります。それ以外の場合は、クラスパス内のjar内に存在することもあります。クラスパス内のディレクトリに対して、リソースバンドルは/またはで指定できます。セパレータ。 「。」推奨されます。