getResourceAsStream--->

4343 ワード

----------------------resourceBundle読み込みプロファイル------------------------------------

テストと検証


多言語環境をシミュレートします
4つのリソースファイルを定義する:res_en_US.properties、res_zh_CN.properties、res_zh.properties、res.properties
res_en_US.properties:cancelKey=cancel
res_zh_CN.properties:cancelKey=u 53 D 6u 6 D 88(キャンセル)
res_zh.properties:cancelKey=u 53 D 6u 6 D 88 zh(zhキャンセル)
res.properties:cancelKey=u 53 D 6u 6 D 88 default(defaultをキャンセル)
命名規則:リソース名+言語_国別propertiesは、各リソースファイルにローカライズされた情報を定義していますが、システムはどのように対応するリソースファイルを取得しますか?
ResourceBundle bundle = ResourceBundle.getBundle("res", new Locale("zh", "CN"));

そのうちnew Locale(「zh」,「CN」);このオブジェクトはプログラムにあなたのローカリゼーションの情報を教えて、これを持って言いましょう:プログラムはまずclasspathの下でresを探しますzh_CN.properties
存在しなければresを探しに行きますzh.properties、まだ存在しない場合はres.propertiesを探しますが、見つからない場合は異常を投げます:MissingResourceException
テストプログラムを書いて検証してみましょう.
package bundle.test;

import java.util.Locale;
import java.util.ResourceBundle;

public class BundleTest {

	public static void main(String args[]) {
		ResourceBundle bundle = ResourceBundle.getBundle("res", new Locale("zh", "CN"));
		String cancel = bundle.getString("cancelKey");
		System.out.println(cancel);
		
		bundle = ResourceBundle.getBundle("res", Locale.US);
		cancel = bundle.getString("cancelKey");
		System.out.println(cancel);
		
		bundle = ResourceBundle.getBundle("res", Locale.getDefault());
		cancel = bundle.getString("cancelKey");
		System.out.println(cancel);

		bundle = ResourceBundle.getBundle("res", Locale.GERMAN);
		cancel = bundle.getString("cancelKey");
		System.out.println(cancel);
	}
}

出力:
 
cancel
 
 

ここの最初の3つは私たちの予想範囲内ですが、最後のGERMANは、res.propertiesというリソースパッケージを使うのではないでしょうか.どうやってresを使ったの?zh_CH.properties?
ResourceBundleは、現在のシステムの言語環境に基づいてローカリゼーションされた情報であるfallback(すなわち、スタンバイ)を提供してくれました.
だからGERMANが見つからなかったら、後でCHINAを探しに行くのでres_を見つけましたzh_CH.propertiesというリソースパッケージ
この点は私もソースコードを見てやっと分かりました.次はいくつかの重要なソースコードを貼ります.
ResourceBundle baseBundle = null;
	for (Locale targetLocale = locale;
	     targetLocale != null;
	     targetLocale = control.getFallbackLocale(baseName, targetLocale)) {//  
	    // do something  
	}

追跡するgetFallbackLocale(baseName,targetLocale)代替案を見てみましょう.
public Locale getFallbackLocale(String baseName, Locale locale) {
	    if (baseName == null) {
		throw new NullPointerException();
	    }
	    Locale defaultLocale = Locale.getDefault();
	    return locale.equals(defaultLocale) ? null : defaultLocale;
	}

 
----------------------JavaでgetResourceAsStreamの使い方プロファイルを読み込む-----------------------
まず、JavaのgetResourceAsStreamには次のようなものがあります.1.Class.getResourceAsStream(String path):pathが'/'で始まる場合、デフォルトではこのようなパッケージからリソースを取り出し、'/'で始まると
ClassPathルートで取得します.これはpathによって絶対パスを構築するだけで、最終的にはClassLoaderによってリソースを取得します.
2. Class.getClassLoader.getResourceAsStream(String path):デフォルトではClassPathルートの下から取得されます.pathは'/'で始まることはできません.最終的には
ClassLoaderはリソースを取得します.
3. ServletContext. getResourceAsStream(String path):WebAPPルートディレクトリからデフォルトでリソースを取得し、Tomcatでpathが'/'で始まるかどうかは関係ありません.
もちろんこれは具体的な容器の実現と関係がある.
4.Jsp下のアプリケーション内蔵オブジェクトは、上のサーブレットContextの実装です.
次に、getResourceAsStreamの使い方には、次のようなものがあります.
第一:ロードするファイルと.classファイルは同じディレクトリの下にあります.例えば、com.x.yの下にはクラスmeがあります.class、リソースファイルmyfile.xml
では、次のコードがあります.
me.class.getResourceAsStream("myfile.xml");
第二:me.classディレクトリのサブディレクトリの下、例えば:com.x.yの下にはクラスmeがあります.class、com.x.y.fileディレクトリの下にリソースファイルmyfile.xml
では、次のコードがあります.
me.class.getResourceAsStream("file/myfile.xml");
第三:不在me.classディレクトリの下にも、サブディレクトリの下にもありません.例えば、com.x.yの下にはクラスmeがあります.class、com.x.fileディレクトリの下にリソースファイルmyfile.xml
では、次のコードがあります.
me.class.getResourceAsStream("/com/x/file/myfile.xml");
まとめてみると、2つの書き方かもしれません
第一:前面に「/」がある
「/」はプロジェクトのルートディレクトリを表し、たとえばプロジェクト名はmyproject、「/」はmyprojectを表します.
me.class.getResourceAsStream("/com/x/file/myfile.xml");
第二:前に「/」がない
現在のクラスを表すディレクトリ
me.class.getResourceAsStream("myfile.xml");
me.class.getResourceAsStream("file/myfile.xml");