クラスローダは、 ローディング・クラス・パスからリソースを取得するための二つの方法を提供します。
パブリックURLのgetResource(文字列名)。 公共のInputStream getResourceAsStream(文字列名)。
ここでは名前は、リソースタイプのパスであり、そしてそれは、ルートパスに「/」の相対的な位置です。URLオブジェクトを取得するのgetResourceリソース、正しい位置からデータを抽出してもよい保証プログラムの入力ストリームを取得getResourceAsStreamリソース参照を見つけることです。
しかし、ではない、実際に使用されるこれらの二つの方法のクラスローダが、のgetResourceのクラスとgetResourceAsStreamメソッドClassオブジェクトは、(例えば)YourClass.classやYourClass.getClass(など)あなたのクラスから取得することができるので、一度ClassLoaderを呼び出す必要がありますYourClass.getClassLoader()メソッドが、文JDKのドキュメントによると、これらの2つの方法のClassオブジェクトは、実際に行うには、そのClassLoaderをロードするための「委員会」(代表者)であるので、ちょうどこれらの2つの方法にClassオブジェクトを使用しますそれは。
したがって、ダイレクトコール this.getClass()getResourceAsStream(文字列名) 、フローを取得し、
静的用いる方法ClassLoader.getSystemResourceAsStream(文字列名) ;。
ここではクラスパスと現在のクラスの絶対パスを取得するための、いくつかの方法があります。あなたは、リソースの絶対パスを取得する必要があるメソッドの一部を使用する必要があります。
1. this.getClass()。getResourceの(「」)
現在のディレクトリを取得するためには、URIクラスのクラスファイルです。自分を含めていません!
例えば:ファイル:/ D:/ワークスペース/ jbpmtest3 / binに/ COM /試験/
2 this.getClass()のgetResource( "/")。
得られた電流は、クラスパスである絶対URIパス 。
例えば:ファイル:/ D:/ワークスペース/ jbpmtest3 /ビン/
3 this.getClass() 。 。のgetClassLoader()のgetResource( "")
また、現在のクラスパスが得られた絶対URIパス 。
例えば:ファイル:/ D:/ /ワークスペース/ jbpmtest3 /ビン
4. ClassLoader.getSystemResource( "")
クラスパス電流が得られる絶対URIのパスを 。
ファイル:のような/ D:/ワークスペース/ jbpmtest3 / binに/
5 。にThread.currentThread()getContextClassLoader ().GetResource( "")
得られたクラスパスが電流である絶対URIパス 。
例えば:ファイル:/ D:/ワークスペース/ jbpmtest3 / binに/
6 。ServletActionContext.getServletContext()getRealPath( "/")
、Webアプリケーション の絶対パスを取得するために、Webアプリケーションのルート。このように、我々はあなたがリソースを検索するために、絶対パスを構築することができ、Webアプリケーションのルートディレクトリに相対パスを提供する必要があります。
以下のような:ファイル:/ D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/WebProjectの
注意事項:
1.尊敬のはSystem.getProperty( "はuser.dir"と一緒に使用しないでください現在のユーザーディレクトリに)相対。これは、いつでもあなたを殺すことができる、時限爆弾です。
2.リソースの絶対パスのURIの形式を使用してみてください。それは簡単にURI、URL、Fileオブジェクトに変換することができます。
3.クラスパスの反対側に相対パスを使用してみてください。絶対パスを使用しないでください。上記ClassLoaderUtilクラス公開静的URLのgetExtendResourceを使用して(文字列relativePath)メソッドは、クラスパス・リソースのすべての位置の相対位置を使用することができました。
4.ハードコードされた絶対パスを使用しないでください。我々は現在のクラスパスの絶対パスを取得するのgetResource ClassLoaderクラス(「」)メソッドを使用することができますので。あなたは、ハードコードされたよりもはるかに優れた構成ファイルを使用して、絶対パスを指定する必要がある場合は!
外部CLASSPATHパスを取得する方法
。URL this.getClassベース=()のgetResource(「」); //現在位置の最初のクラスは、このような/ホーム/パイ/ testjava /ビルド/クラス/ NETの/ように、配置され得る
文字列のパス=新しいファイル(base.getFile()、 " ...... / ...... / ...... /" +名).getCanonicalPath(); //は/ホーム/ポパイ/ testjava /名前を得ることができ
、ANTからブートプログラム場合は、また、これを.getClass()。getResourceの(「」 ) あなたが成功することができ、デバッグと直接より奇妙な、JAVAコマンドラインから取り出しました。
// クラスパス目录下 URLリソース= TestASM。クラス .getResource( "/" ); // クラスパス+该类所在路径 URLリソース1 = TestASM。クラス .getResource( "" ); // クラスパス目录下 URLリソース2 = TestASM。クラス .getClassLoader()のgetResource( ""。); // nullの URL resource3 = TestASM。クラス .getClassLoader()のgetResource( "/"。); // ファイル:/ D:/ソースコード/ demo4 /標的/クラス/ のSystem.out.println(リソース) //ファイル:/ D:/ソースコード/ demo4 /標的/クラス/ COM /例/ demo4 / ASM / のSystem.out.println(リソース1)。 // ファイル:/ D:/ソースコード/ demo4 /標的/クラス/ のSystem.out.println(リソース2)。 // ヌル のSystem.out.println(resource3)。
// クラスパス下code.txt のInputStream asStream = TestASM。クラス .getClassLoader()getResourceAsStream( "code.txt"。); System.out.println(asStream)。 // 加/表示获取クラスパス下code.txt、不加/返回为ヌル のInputStream asStream1 = TestASM。クラス .getResourceAsStream( "/ code.txt" ); System.out.println(asStream1)。 // 获取クラスパス下code.txt文件 のInputStream asStream2 = TestASM。クラス .getClassLoader()getSystemResourceAsStream( "code.txt"。); System.out.println(asStream2)。 System.out.println( "--------------------------------------";) // 使用ツールResourceUtilsは、クラスパスのファイルの取得 ":code.txtクラスパス" FILE1 = ResourceUtils.getFile(ファイル); FileInputStreamのIS = 新しい新しいFileInputStreamを(FILE1); System.out.printlnは(IS) のSystem.out。 println( "--------- ---------、以下の実施例をオブジェクトファイルストリームを開くためにURLを使用して" ); InputStream InputStreamはは。= TestASMのクラス .getResource( "/ code.txt" )。openStream(); たFileOutputStreamのFOS = 新しい新たFileOutputStream( "C:\\ 18030501人のユーザー\\ \\ \\ aaa.txtデスクトップ" ); バイト [] = BYS 新しい新しい バイト [1024]; int型のlen; 一方、(!(LEN = inputStream.read(BYS))= -1 ){ fos.write(BYS、 0 、LEN)。 fos.flush(); } inputStream.close()。 fos.close();