8

したがって、この質問は私が信じていた百万回も尋ねられており、私はそれらを数時間読んで、何人かの人々から与えられたいくつかのオプションを試してきましたが、どれもうまくいきません.

アプリケーションの JAR 内のディレクトリ内のすべてのファイルを一覧表示したいので、IDE では次のように動作します。

File f = new File(this.getClass().getResource("/resources/").getPath());

for(String s : f.list){
   System.out.println(s);
}

これにより、ディレクトリ内のすべてのファイルが得られます。

今、私もこれを試しました:

InputStream in = this.getClass().getClassLoader().getResourceAsStream("resources/");
    InputStreamReader inReader = new InputStreamReader(in);
    Scanner scan = new Scanner(inReader);

    while (scan.hasNext()) {
        String s = scan.next();
        System.out.println("read: " + s);
    }

    System.out.println("END OF LINE");

そしてIDEから、ディレクトリ内のすべてのファイルを出力します。IDE の外側には、"END OF LINE" が出力されます。

さて、これでもJar内のエントリを見つけることができます:

        String s = new File(this.getClass().getResource("").getPath()).getParent().replaceAll("(!|file:\\\\)", "");
        JarFile jar = new JarFile(s);

            JarEntry entry = jar.getJarEntry("resources");

        if (entry != null){
            System.out.println("EXISTS");
            System.out.println(entry.getSize());
        }

それは私がその文字列に対してしなければならなかった恐ろしいコーディングです。

とにかく... Jar内の「resources」ディレクトリ内のリソースのリストを取得できません...どうすればこれを行うことができますか???

4

3 に答える 3

10

最初に Jar ファイルの内容を列挙せずに、フィルター処理された内部リソースのリストを取得する方法はありません。

幸いなことに、それは実際にはそれほど難しいことではありません (幸運なことに、私にとっては、ほとんどのハードワークをあなたがこなしてくれました)。

基本的に、 への参照を取得JarFileしたら、単純にそれを要求し、そのentriesリストを反復処理する必要があります。

JarEntry必要な一致 (つまり)の名前を確認することで、必要なresources要素をフィルター処理できます...

例えば...

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class ReadMyResources {

    public static void main(String[] args) {
        new ReadMyResources();
    }

    public ReadMyResources() {
        JarFile jf = null;
        try {            
            String s = new File(this.getClass().getResource("").getPath()).getParent().replaceAll("(!|file:\\\\)", "");
            jf = new JarFile(s);

            Enumeration<JarEntry> entries = jf.entries();
            while (entries.hasMoreElements()) {
                JarEntry je = entries.nextElement();
                if (je.getName().startsWith("resources")) {
                    System.out.println(je.getName());
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                jf.close();
            } catch (Exception e) {
            }
        }
    }

}

警告

このタイプの質問は、実際には少し聞かれます。実行時に Jar の内容を読み取ろうとするよりも、使用可能なリソースのリストを含む何らかのテキスト ファイルを作成する方がよいでしょう。

これは、Jar ファイルが作成される前に、ビルド プロセスによって動的に生成される可能性があります。このファイルを(getClass().getResource()たとえば、経由で)読み込んでから、テキストファイル内の各リソースリストを検索する方がはるかに簡単なソリューションです...私見

于 2013-08-15T07:05:07.077 に答える
6

Spring Frameworkユーザーの場合、PathMatchingResourcePatternResolver次のようなことを行うには、 を参照してください。

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath:path/to/resource/*.*");

for (Resource resource : resources) {
    InputStream inStream = resource.getInputStream();
    // Do something with the input stream
}
于 2018-05-15T19:56:40.883 に答える