2011-12-10 7 views
3

私のJUnitテストの1つでは、ディレクトリに含まれるすべてのファイルをロードしようとしています。私は.getClassLoader().getResource("otherresources")を使ってディレクトリを探しました。私はそれから新しいjava.io.Fileを作った。その後、listFiles()を使用してすべての子ファイルを取得し、.getClassLoader().getResource()を再度使用してそれぞれのファイルをロードしました。.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で失敗します。私は問題は、ファイルapiがリソースが配備されているJARファイル内で意図したとおりに動作していないことと関係があると思います。

これを修正する方法についてのヒントを教えてください。

答えて

5

正しいですが、File APIはファイルシステムからのみ読み取ることができ、JARファイル内では読み取れません。

残念ながら、ちょうどこれを達成するためにいくつかのハッキングを利用するいくつかの追加のライブラリを使用せずに、あなたがしようとしていることを正確に行う良い方法はありません。クラスパス上のリソースは、どこからロードされるのか(ディスク、JARファイル、HTTP、データベース、または他のエキゾチックなリソース(使用可能なファイルの列挙実現不可能であろう)。あなたが興味のある他のリソースを見つけるために参照できる、よく知られている名前の "インデックス"や他の同様のファイルを含めることです。

これらの「ハック」の1つは、 JARファイルへのパスを知っていれば、JarFile(あるいはちょうどZipFile)を使って読み込むことができます。

+0

これらのファイル(xmlファイル)がJAR内にあることは確かです。私はJarFileを使ってみよう。 –

3
.getClassLoader().getResource("otherresources") 

未テスト。「ディレクトリ」があれば、それを使ってアーカイブ自体に戻ります。

  • アーカイブにZipInputStreamを設定します。
  • nullまでgetNextEntry()と呼び出し、必要な場所に一致するエントリを拡張可能なリスト(例:ArrayList)に追加します。
  • アーカイブの場所からURLを構築し、もちろんZipEntry.getName()

、私は通常、アーカイブを作成するときに、アーカイブ内の既知の場所にそのリストを含め、対象リソースのリストを作成することをお勧め。しかし、このユースケースでは上記のことで十分です。

関連する問題