2012-06-25 4 views
3

필자는 classpath에있는 디렉토리에서 파일 목록을 읽어야하며 File API를 사용하는 것을 선호하지만 아카이브 내에서 그렇게 할 수없는 것으로 보입니다. 이것은 내 지역 환경 단위 테스트에서 작동하지만, 내가 EAR 내부의 WAR로 배포 할 때, 파일의 목록은 NULL을 반환 :Java에서 자원 경로를 사용하여 WAR 클래스 경로 내에 디렉토리 파일을 나열 할 수 있습니까?

File dir = new File(getClass().getClassLoader().getResource("mydir").getPath()); 
File[] files = dir.listFiles(); 
+0

입력 스트림에서 파일 목록을 어떻게 얻을 수 있습니까? 나는 그들의 이름을 모른다. 그래서 나는 실제 File 객체의 목록을 필요로한다. –

답변

2

전쟁이 압축 해제되지 않은 경우 파일 API를 사용할 수 없지만 Servlet API를 사용할 수 있습니다.

ServletContext의 getResourcePaths 메소드를 사용하면 "디렉토리"의 모든 구성원을 검색 한 다음 getResource 또는 getResourceAsStream을 사용하여 디렉토리의 파일 내용을 검색 할 수 있습니다.

for (String s : context.getResourcePaths("foo")) { 
    InputStream contents = context.getResourceAsStream(s); 
    //do something with the contents 
} 
+0

그럴 수도 있다고 생각했습니다. 어디서나, Java 문서에서 압축 해제 된 WAR의 파일 목록과 관련하여 이것이 어디에 명시되어 있는지 알고 있습니까? –

+0

javadoc에서 명시 적으로 알지 못하는 곳. 서블릿 엔진은 WAR의 내용을 파일 시스템에 배치 할 의무가 없다는 사실의 결과입니다. 그 덩어리는 서블릿 JSR에 언급되어 있지만 javadoc에는 특별한 인용문이 없습니다. 모든 것이 javadoc에있는 것은 아닙니다. –

0

하는 자바 SE 7을 사용하는 경우 시도 :

Path jarPath = Paths.get(...); 
try (FileSystem jarFS = FileSystems.newFileSystem(jarPath, null)) { 
    Path dirJarPath = jarFS.getPath("/foo/mydir"); 
    <use a FileVisitor and Files.walkFileTree> 
} 

http://docs.oracle.com/javase/7/docs/api/java/nio/file/FileVisitor.html

+0

죄송합니다. JDK 1.6 태그를 포함하도록 게시물을 편집했습니다. –

+0

@Puce : 전쟁이 포함 된 귀를 풀지 않은 상태에서 jar 파일의 경로를 얻는 방법은 무엇입니까? 그것을 휴대용 방식으로하는 것은 정확히 간단하지 않습니다. 비록 그것이 있었다면, 나는 jar 파일을 반복적으로 압축 해제하는 것이 그리 성능이 좋지 않을 것이라고 걱정합니다. –

+0

@SeanReilly 최근에는 SoftSmithy 유틸리티 라이브러리에 유틸리티 메서드를 추가하여 클래스의 jar 파일을 가져 왔지만 아직 릴리스하지 않았습니다. 여기에서 코드를 찾을 수 있습니다 (라이센스 : CDDL) : http://softsmithy.hg.sourceforge.net/hgweb/softsmithy/lib/main-golden/file/058faa0f7621/lib-core/src/main/java/org/ softsmithy/lib/nio/file/JarFiles.java 성능에 관한 문제 : 문제가있는 경우 프로필을 작성해야합니다. – Puce