0

リソース ファイル (たとえば ) のランタイム クラスパスをスキャンし、そのハンドルをres/config/meta.cfg作成する必要がある状況があります。File私が思いついた最高のものは次のとおりです。

// This file is located inside a JAR that is on the runtime classpath.
String fileName = "res/config/meta.cfg";

try {
    InputStream inStream = ClassLoader.getSystemResourceAsStream(fileName);
    File file = new File(String.format("${java.io.tmpdir}/%s", fileName));
    FileOutputStream foutStream = null;
    foutStream = new FileOutputStream(file);

    int read = 0;
    byte[] bytes = new byte[1024];
    while((read = inStream.read(bytes)) != -1)
        foutStream.write(bytes, 0, read);

    foutStream.close();

    return file;
} catch (Exception exc) {
    throw new RuntimeException(exc);
}

基本的に、リソースを として読み込みInputStream、ストリームを一時ファイル ( の下) に書き込んで、有効なハンドルを{$java.io.tmpdir}取得できるようにします。File

これは、納屋の周りを 3 方向に移動するようです。これを行うためのより良い/より簡単な/よりエレガントな方法はありますか? 前もって感謝します!

4

1 に答える 1

2

いいえ。

もちろん、ライブラリを使用して のコンテンツをファイルにコピーすることはできますが (おそらくそうするべきです) InputStream、それは明らかにあなたの質問のポイントではありません。

クラスパスはディレクトリだけで構成されているわけではありません。リソースは、アーカイブ (通常は JAR) 内またはサーバー上にある可能性があり、オブジェクトを介してアクセスできるものとして存在しない場合がありjava.io.Fileます。

通常、中心的な問題は、で十分なjava.io.Fileオブジェクトを使用することです。InputStreamサードパーティのライブラリを使用している場合、何もできない場合がありますが、これはライブラリの設計者が慎重に作業しなかったことを示唆しています。独自のコードでファイル ハンドルが必要な場合は、InputStream. ほとんどの場合、それは可能です。

于 2013-09-24T11:19:19.637 に答える