2

jar に含まれているファイルにアクセスしようとしています。

私のコードの冒頭は次のとおりです。

import java.io.*;
import java.net.*;

public class intro {
public static void main(String[] args) throws IOException{

    URL jarUrl = intro.class.getResource("myFile.jar");
    File myJar = new File(jarUrl.toString());

    FileInputStream fis = new FileInputStream(myjar);
}

次のエラーが表示されます。

Exception in thread "main" java.io.FileNotFoundException: file:\...myFile.jar (The filename, directory name, or volume label syntax is incorrect)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at intro.main(intro.java:10)

URL の検索やファイルの初期化に問題はないようですが、FileInputStream を機能させることができません。私が間違っていることを誰かが知っていますか?助けていただければ幸いです。

4

4 に答える 4

3

この方法では、Jar 化されたリソースにアクセスできません。Jar 内のファイルはFile(つまり、ファイル システム ファイルのように) ではなく、異なる概念です。

代わりにを使用する必要がありますURL.openStream

InputStream is = null;
try {
    is = jarURL.openStream();
    // ... Read from stream
} catch (IOException exp) {
} finally {
    try {
      if (is != null) {
        is.close();
      }
    } catch (Exception exp) {
    }    
}
于 2012-09-15T03:39:08.080 に答える
1

あなたのアプローチは多くのレベルで間違っています:

  1. URL はファイル名ではないため、これは誤りです。

    File myJar = new File(jarUrl.toString());
    

    jarUrlが typeであるとするとjava.net.URL、次のように記述します。

    File myJar = new File(new URI(jarUrl));
    
  2. これは、(myJar正しいと仮定して) JAR ファイルをバイト ストリームとして開くため、間違っています。

    FileInputStream fis = new FileInputStream(myJar);
    

    実際には、JAR / ZIP ファイル クラスを使用してそれを開き、それらを使用して JAR に含まれるファイルのストリームを開く必要があります。次のようになります。

    ZipFile zip = new ZipFile(myJar);
    ZipEntry entry = zip.getEntry(filePathInZip);
    InputStream is = entry.getInputStream();
    

    (リソースのリークを防ぐために、必要な例外処理とクローズに必要なコードはすべて省略しました。)

  3. これは URL として間違っているように見えます。

    file:\...myFile.jar
    

    バックスラッシュと 3 つのドットは何ですか? 整形式の URL は使用しません\

于 2012-09-15T03:47:04.707 に答える
1

これが既知のリソースである場合は、次を使用できます。

InputStream is =intro.class.getResourceAsStream("myFile.jar");

他の答えは、あなたがこれを間違っていると言うとき、いくつかの仮定をしています。しかし、最初にリソースとして、次にファイルとして Jar にアクセスしようとしているのは疑わしいです...

また、これを参照してください: getResourceAsStream() vs FileInputStream

于 2012-09-15T03:51:05.253 に答える
0

私は茂みの周りを殴りません、そして私はすぐに要点に行きます。この方法では、jar内のファイルにアクセスすることはできません。代わりに、以下のコードを試してください。

URL jarUrl = intro.class.getResource("myFile.jar");
InputStream is = null;
String s = new String();

try {
       is = jarURL.openStream();
       Scanner scan = new Scanner(is);

       while(scan.hasNextLine){    
          s = scan.nextLine() + s;    
       }       
 } catch (IOException exp) {
 } finally {        
     is.close();
 }
于 2012-09-15T05:16:44.643 に答える