web-dev-qa-db-ja.com

Javaファイルとしてのリソース

Javaには、クラスローダーを介してjarから取得したリソース上にFileインスタンスを構築する方法がありますか?

私のアプリケーションは、jar(デフォルト)または実行時に指定されたファイルシステムディレクトリ(ユーザー入力)からいくつかのファイルを使用します。の一貫した方法を探しています
a)これらのファイルをストリームとしてロードする
b)ユーザー定義ディレクトリまたはjar内のディレクトリ内のファイルをそれぞれリストする

編集:どうやら、Java.io.Fileから完全に離れることが理想的なアプローチでしょう。クラスパスからディレクトリをロードし、その内容(それに含まれるファイル/エンティティ)をリストする方法はありますか?

119
Mantrum

ClassLoader.getResourceAsStreamおよびClass.getResourceAsStreamは、間違いなくリソースデータをロードする方法です。ただし、クラスパスの要素の内容を「リスト」する方法はないと思います。

場合によっては、これは単に不可能かもしれません。たとえば、ClassLoadercouldは、要求されたリソース名に基づいて、オンザフライでデータを生成します。 ClassLoader AP​​I(基本的にクラスパスメカニズムが機能するもの)を見ると、必要なことを実行するものがないことがわかります。

実際にjarファイルを持っていることがわかっている場合は、ZipInputStreamを使用してそれをロードし、使用可能なファイルを見つけます。ただし、ディレクトリとjarファイルには異なるコードが使用されます。

ファイルを最初に個別に作成する場合の1つの選択肢は、利用可能なリソースのリストを含む一種のマニフェストファイルを含めることです。 jarファイルにバンドルするか、ファイルとしてファイルシステムに組み込み、ユーザーにリソースの選択肢を提供する前にそれをロードします。

57
Jon Skeet

私は同じ問題を抱えていて、次を使用することができました:

// Load the directory as a resource
URL dir_url = ClassLoader.getSystemResource(dir_path);
// Turn the resource into a File object
File dir = new File(dir_url.toURI());
// List the directory
String files = dir.list()
97
Chris Conway

これが私のアプリケーションの1つからのコードです。あなたのニーズに合うかどうか教えてください。使用するファイルがわかっている場合は、これを使用できます。

URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png");
File imageFile = new File(defaultImage.toURI());

お役に立てば幸いです。

54
Maurice Rogers

Jarから取得したリソースでFileインスタンスを構築する信頼できる方法は、リソースをストリームとして一時ファイルにコピーすることです(JVMが終了すると一時ファイルは削除されます)。

public static File getResourceAsFile(String resourcePath) {
    try {
        InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
        if (in == null) {
            return null;
        }

        File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
        tempFile.deleteOnExit();

        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            //copy stream
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
        return tempFile;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}
10
Lukas Masuch

これを試して:

ClassLoader.getResourceAsStream ("some/pkg/resource.properties");

他にも利用可能な方法があります。ここを参照してください: http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html

4
topchef

これは1つのオプションです。 http://www.uofr.net/~greg/Java/get-resource-listing.html

2
Fish