3

JUnit テストの 1 つで、ディレクトリに含まれるすべてのファイルをロードしようとしています。以前.getClassLoader().getResource("otherresources")はディレクトリを見つけていました。それから私は新しいものを作りましたjava.io.File。次に、listFiles()すべての子ファイルを取得してから.getClassLoader().getResource()、それらの各ファイルを再度ロードしました。

URL url = FileLoadTest.class.getClassLoader().getResource("otherresources");
File directory = new File(url.getPath());
File[] files = directory.listFiles();

基本的に、ディレクトリ内のすべてのファイルを、それらが何であるかを正確に知らなくてもロードできるようにしたいと考えています。

Eclipse でテストを適切に実行できます。Maven() を使用してプロジェクトをビルドするmvn installか、surefire( mvn -Dtest=FileTest test)を使用してテスト ケースを単独で実行すると、テスト ケースはNullPointerException. この問題は、リソースがデプロイされている JAR ファイル内で File API が意図したとおりに機能しないことに関係していると思います。

これを修正する方法に関するヒントはありますか?

4

2 に答える 2

5

正解です。ファイル API は、JAR ファイル内ではなく、ファイル システムからのみ読み取ることができます。

残念ながら、これを達成するためにいくつかのハックを利用する追加のライブラリを使用せずに、あなたがやろうとしていることを正確に行う良い方法はありません. クラスパス上のリソースは、それらがどこからロードされるかという保証がないため、列挙可能であることを意図していません (ディスクから、JAR ファイル、HTTP、データベース、またはその他の特殊なリソース (利用可能なファイルの列挙を含むもの) から可能性があります)。実現不可能でしょう)。最善のアプローチは、関心のある他のリソースを見つけるために参照できる、既知の名前を持つ「インデックス」または他の同様のファイルを含めることです。

これらの「ハック」の 1 つは、JAR ファイルへのパスがわかっている場合、それらを使用してJarFile(または単にZipFile) 読み取ることができることです。

于 2011-12-10T02:39:36.447 に答える
3
.getClassLoader().getResource("otherresources")

未テスト。「ディレクトリ」を取得したら、それを使用してアーカイブ自体に戻ります。

  • ZipInputStreamをアーカイブに確立します。
  • getNextEntry()untilを呼び出しnullて、必要な場所に一致するエントリを展開可能なリスト (例: ArrayList) に追加します。
  • アーカイブの場所から URL を作成し、ZipEntry.getName()

もちろん、通常は、アーカイブを作成するときにターゲット リソースのリストを作成し、そのリストをアーカイブ内の既知の場所に含めることをお勧めします。ただし、このユースケースには上記で十分かもしれません。

于 2011-12-10T02:59:03.913 に答える