72

アプリをjarファイルにデプロイしました。リソースの 1 つのファイルから jar ファイルの外部にデータをコピーする必要がある場合は、次のコードを実行します。

URL resourceUrl = getClass().getResource("/resource/data.sav");
File src = new File(resourceUrl.toURI()); //ERROR HERE
File dst = new File(CurrentPath()+"data.sav");  //CurrentPath: path of jar file don't include jar file name
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dst);
 // some excute code here

私が遭遇したエラーは次のとおりURI is not hierarchicalです。このエラーは、IDE で実行したときに発生しません。

上記のコードを StackOverFlow の他の投稿のヘルプとして変更すると、次のようになります。

InputStream in = Model.class.getClassLoader().getResourceAsStream("/resource/data.sav");
File dst = new File(CurrentPath() + "data.sav");
FileOutputStream out = new FileOutputStream(dst);
//....
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) { //NULL POINTER EXCEPTION
  //....
}
4

6 に答える 6

116

これはできません

File src = new File(resourceUrl.toURI()); //ERROR HERE

ファイルではありません!jar ファイルを実行しないため、ide から実行するとエラーは発生しません。IDE では、クラスとリソースがファイル システムに抽出されます。

InputStreamただし、次の方法で開くことができます。

InputStream in = Model.class.getClassLoader().getResourceAsStream("/data.sav");

を削除し"/resource"ます。通常、IDE はファイル システムのクラスとリソースを分離します。しかし、jar が作成されると、それらはすべてまとめられます。そのため、フォルダー レベル"/resource"はクラスとリソースの分離にのみ使用されます。

クラスローダーからリソースを取得するときは、リソースがjar内に持つパス、つまり実際のパッケージ階層を指定する必要があります。

于 2012-04-13T16:32:11.283 に答える
21

なんらかの理由java.io.Fileで、Jar ファイル内のリソースを指すオブジェクトを作成する必要がある場合、答えは次のとおりです: https://stackoverflow.com/a/27149287/155167

File f = new File(getClass().getResource("/MyResource").toExternalForm());
于 2016-06-21T15:26:41.440 に答える
11

Eclipse RCP / プラグイン開発者向けのソリューションは次のとおりです。

Bundle bundle = Platform.getBundle("resource_from_some_plugin");
URL fileURL = bundle.getEntry("files/test.txt");
File file = null;
try {
   URL resolvedFileURL = FileLocator.toFileURL(fileURL);

   // We need to use the 3-arg constructor of URI in order to properly escape file system chars
   URI resolvedURI = new URI(resolvedFileURL.getProtocol(), resolvedFileURL.getPath(), null);
   File file = new File(resolvedURI);
} catch (URISyntaxException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
}

FileLocator.toFileURL(fileURL)ではなくを使用することが非常に重要resolve(fileURL) です。プラグインが jar にパックされると、Eclipse が一時的な場所にアンパックされたバージョンを作成し、File. たとえば、Lars Vogel の記事には誤りがあると思います - http://blog.vogella.com/2010/07/06/reading-resources-from-plugin/

于 2014-05-30T11:04:57.227 に答える
0

私は自分でこの問題に出くわしましたが、別のオプションを追加したいと思います(@dash1eからの完璧な説明に):

以下を追加して、プラグインを (jar ではなく) フォルダーとしてエクスポートします。

Eclipse-BundleShape: dir

あなたにMANIFEST.MF

少なくとも、エクスポート ウィザード (に基づく*.product) ファイルを使用して RCP アプリをエクスポートすると、これが尊重され、フォルダーが生成されます。

于 2014-03-10T16:32:43.957 に答える