2

次を使用してクラスパス上のリソースにアクセスしようとしていますgetResourceAsStream():

InputStream is = getClass().getResourceAsStream(path);

path が次のようなものであれば/net/original/xsdtestxml.xml、問題はありません。../ただし、特定のファイルにアクセスするために「親に移動」記号を使用する必要がある状況があります。特定のパラメーターに基づいて手動でパスを作成しています。

最終結果は次のようになります。

/net/original/../original/xsdtestxml.xml

これはEclipseでうまく機能します。Eclipse の外部で実行すると (.class が含まれるプログラムのターゲット フォルダーのコマンド ラインから) 正常に動作します。ただし、それらをjarファイルにパックするとすぐにスローされNullPointerExceptionます。

getResourceAsStream()jar にエクスポートした後、そのような形式をサポートする可能性はありますか? ../そうでない場合、符号なしでファイル パスを取得できる Java/ユーティリティ クラスはありますか? たとえば、フォーマットに変換する/net/original/../original/xsdtestxml.xmlには/net/original/xsdtestxml.xml

考えられる解決策の 1 つ:

パッケージには、必要なことを行うURIクラスがあります。コンストラクターでオブジェクトを作成するか、静的メソッドを使用java.netするだけです。次に、メソッドを呼び出し、またはメソッドを使用して文字列パスを取得できます。URIcreate(String)normalize()toString()getPath()

これが私のために働いたコードの例です:

String finalPath = URI.create(inputPath).normalize().getPath();

inputPath../リテラルを含むことができるパスです。これは、クラスパス上のjarからファイルにアクセスするために必要なものに完全に変換/net/original/../original/xsdtestxml.xmlされます。/net/original/xsdtestxml.xml

4

1 に答える 1

0

jar 内のファイルにアクセスする必要がある場合は、 JarFileおよびJarFile.entries()を使用して jar ファイルを開いて読み取ることをお勧めします。

例えば:

String s = getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
JarFile jf = new JarFile(java.net.URLDecoder.decode(s, "UTF-8"));
// ...

…を呼び出した後、 (— を空白に)URLDecoder.decode()などをデコードすることに注意してください。</p> %20getFile()

于 2012-07-31T14:12:25.650 に答える