Javaには、クラスローダーを介してjarから取得したリソース上にFileインスタンスを構築する方法がありますか?
私のアプリケーションは、jar(デフォルト)または実行時に指定されたファイルシステムディレクトリ(ユーザー入力)からいくつかのファイルを使用します。の一貫した方法を探しています
a)これらのファイルをストリームとしてロードする
b)ユーザー定義ディレクトリまたはjar内のディレクトリ内のファイルをそれぞれリストする
編集:どうやら、Java.io.Fileから完全に離れることが理想的なアプローチでしょう。クラスパスからディレクトリをロードし、その内容(それに含まれるファイル/エンティティ)をリストする方法はありますか?
ClassLoader.getResourceAsStream
およびClass.getResourceAsStream
は、間違いなくリソースデータをロードする方法です。ただし、クラスパスの要素の内容を「リスト」する方法はないと思います。
場合によっては、これは単に不可能かもしれません。たとえば、ClassLoader
couldは、要求されたリソース名に基づいて、オンザフライでデータを生成します。 ClassLoader
API(基本的にクラスパスメカニズムが機能するもの)を見ると、必要なことを実行するものがないことがわかります。
実際にjarファイルを持っていることがわかっている場合は、ZipInputStream
を使用してそれをロードし、使用可能なファイルを見つけます。ただし、ディレクトリとjarファイルには異なるコードが使用されます。
ファイルを最初に個別に作成する場合の1つの選択肢は、利用可能なリソースのリストを含む一種のマニフェストファイルを含めることです。 jarファイルにバンドルするか、ファイルとしてファイルシステムに組み込み、ユーザーにリソースの選択肢を提供する前にそれをロードします。
私は同じ問題を抱えていて、次を使用することができました:
// 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()
これが私のアプリケーションの1つからのコードです。あなたのニーズに合うかどうか教えてください。使用するファイルがわかっている場合は、これを使用できます。
URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png");
File imageFile = new File(defaultImage.toURI());
お役に立てば幸いです。
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;
}
}
これを試して:
ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
他にも利用可能な方法があります。ここを参照してください: http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html
これは1つのオプションです。 http://www.uofr.net/~greg/Java/get-resource-listing.html