1. ホーム
  2. java

[解決済み] JARファイル内のファイルを一覧表示するには?

2022-06-23 18:46:55

質問

私は、ディレクトリからすべてのファイルを読み取るこのコードを持っています。

    File textFolder = new File("text_directory");

    File [] texFiles = textFolder.listFiles( new FileFilter() {
           public boolean accept( File file ) {
               return file.getName().endsWith(".txt");
           }
    });

素晴らしい動作です。ディレクトリ "text_directory" から ".txt" で終わるすべてのファイルで配列を満たします。

どのように私は同様の方法でディレクトリの内容を読み取ることができますか? の中で の中で、JARファイルの内容を読み取ることができますか?

私が本当にしたいことは、JARファイル内のすべての画像をリストアップし、それらを読み込むことができるようにすることです。

ImageIO.read(this.getClass().getResource("CompanyLogo.png"));

(これは "CompanyLogo" が "hardcoded" なので動作しますが、JAR ファイル内の画像の数は 10 から 200 までの可変長です)。

EDIT

というわけで、私の一番の悩みは どのようにして JARファイル名 を知る方法?

を使用してそれを読み取ることができることを認めます。 java.util.Zip .

私のStructureはこんな感じです。

のようなものです。

my.jar!/Main.class
my.jar!/Aux.class
my.jar!/Other.class
my.jar!/images/image01.png
my.jar!/images/image02a.png
my.jar!/images/imwge034.png
my.jar!/images/imagAe01q.png
my.jar!/META-INF/manifest 

今現在、例えば "images/image01.png" を使って読み込むことが出来ています。

    ImageIO.read(this.getClass().getResource("images/image01.png));

しかし、ファイル名がわかっているだけで、残りは動的に読み込まなければなりません。

どのように解決するのですか?

CodeSource src = MyClass.class.getProtectionDomain().getCodeSource();
if (src != null) {
  URL jar = src.getLocation();
  ZipInputStream zip = new ZipInputStream(jar.openStream());
  while(true) {
    ZipEntry e = zip.getNextEntry();
    if (e == null)
      break;
    String name = e.getName();
    if (name.startsWith("path/to/your/dir/")) {
      /* Do something with this entry. */
      ...
    }
  }
} 
else {
  /* Fail... */
}

なお、Java 7では、このように FileSystem を JAR (zip) ファイルから作成し、NIO のディレクトリウォーキングとフィルタリング機構を使用して検索します。これにより、JAR や "exploded" ディレクトリを処理するコードをより簡単に書くことができるようになります。