6

クラスパス/JAR ファイルから File オブジェクトとしてリソースにアクセスしようとしています。代わりに InputStream オブジェクトを使用する方法が推奨されることは承知していますが、File オブジェクトを必要とする外部ライブラリ (WorldEdit) を使用しています。

これが私のコードです:

InputStream templStream = "".getClass().getResourceAsStream("/res/template.prom");
System.out.println("templateStream: " + templStream.toString());
File templFile = new File("".getClass().getResource("/res/template.prom").toURI());
System.out.println("templateFile: " + templFile.canRead());

私はまだEclipseの中にいますが、リソースにアクセスする両方の方法が問題なく機能し、次の出力が生成されます。

templStream: java.io.BufferedInputStream@746d1683
templFile: true

しかし、コードを JAR アーカイブにエクスポートした後、コードは失敗します。

templStream: sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@47aa261b
Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical
    at java.io.File.<init>(File.java:392)
    at SMCToPROM.main(SMCToPROM.java:101)

そのため、リソースにファイルとして直接アクセスする方法、または InputStream を使用してその InputStream をファイルに変換する方法を探していましたが、うまくいきませんでした。

最悪の場合のフォールバック ソリューションは、InputStream をファイル システム上のファイルにコピーしてから、そのファイルを開くことですが、それが必要ないことを願っています。

4

3 に答える 3

5

簡単な答えは、リソースがファイルではないため、できないということです。

サードパーティのライブラリがソースからデータを読み取るだけの場合(したがって、が必要)、サードパーティのライブラリが正しく記述されていないInputStreamか、ライブラリが実際にファイル固有の操作を実行したい場合があります。

これが修正可能なライブラリの見落としではないと仮定すると、実際に自分でファイルを作成する必要があります。を呼び出しFile.createTempFile()て、このファイルにリソースの内容を自分で入力してFileから、このオブジェクトをライブラリに渡します。(もちろん、完了したら削除してください)。

于 2012-05-15T16:46:56.717 に答える
2

jar 化されたリソースにFiles として直接アクセスすることはできません。代わりに、リソースのコンテンツを実際のファイルにコピーし、それをサード パーティのライブラリに渡す必要があります (InputStream取得した を使用できますgetResourceAsInputStream()) 。

于 2012-05-15T16:44:29.697 に答える
1

またはFileによってサポートされるラッパー オブジェクトを作成し、InputStreamそれを適切に作成されていないライブラリ コードに渡すことができます。Byte ArrayByteBuffer

これは単純ではなく、ライブラリがオブジェクトに対して呼び出しているメソッドがわからない場合は、すべてのメソッドの正しい実装を作成する必要がありFileます。

私は似たような状況でこれを 1 回行いましたが、呼び出しのサブセットを知っていたので、すべてのメソッドを正しく実装する必要はありませんでした。運が良ければ、ライブラリが行うことは、呼び出し.getInputStream()て簡単に完了することだけです。

于 2012-05-15T17:03:03.290 に答える