2011-12-10 2 views
3

내 JUnit 테스트 중 하나에서 디렉토리에 포함 된 모든 파일을로드하려고합니다. 디렉토리를 찾으려면 .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, 데이터베이스 또는 기타 이국적인 리소스에서로드 할 수있는 위치가 보장되지 않기 때문에 (사용 가능한 파일 열거 형을 포함하여) 가능하지 않을 것이다). 가장 좋은 방법은 관심있는 다른 리소스를 찾기 위해 참조 할 수있는 잘 알려진 이름의 "색인"또는 다른 유사한 파일을 포함하는 것입니다.

"해킹"중 하나는 JAR 파일의 경로를 알고 있다면 JarFile (또는 심지어 ZipFile)을 사용하여 읽을 수 있습니다.

+0

이 파일 (xml 파일)이 JAR에 있다는 것을 알고 있습니다. JarFile을 사용해 보겠습니다. –

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

테스트되지 않음. '디렉토리'가 생기면 그것을 사용하여 아카이브 자체로 돌아갑니다.

  • 아카이브에 ZipInputStream을 설정하십시오.
  • null까지 getNextEntry()으로 전화하고 필요한 위치와 일치하는 항목을 확장형 목록 (예 : ArrayList)에 추가하십시오.
  • 아카이브를 만들 때 일반적으로 다음 아카이브에서 알려진 위치에서 그 목록을 포함하여, 대상 자원의 목록을 작성 제안은 아카이브의 위치와 ZipEntry.getName() 물론

에서 URL을 구축 . 그러나 위의 경우는이 사용 사례로 충분할 수 있습니다.

관련 문제