2013-08-15 5 views
3

그래서이 질문은 수백만 번 나는 믿었습니다. 몇 시간 동안 읽고 몇 가지 옵션을 시도했지만 그 중 아무 것도 나를 위해 일하지 않았습니다. 나에게 디렉토리 내의 모든 파일을 제공InputStreamReader를 사용하여 JAR 내부의 디렉토리를 읽으십시오

File f = new File(this.getClass().getResource("/resources/").getPath()); 

for(String s : f.list){ 
    System.out.println(s); 
} 

을 : IDE에서이 작품 때문에

나는, 응용 프로그램의 JAR에있는 디렉토리 안에있는 모든 파일을 나열합니다.

지금, 나는이 또한 시도했다 : 디렉토리에

InputStream in = this.getClass().getClassLoader().getResourceAsStream("resources/"); 
    InputStreamReader inReader = new InputStreamReader(in); 
    Scanner scan = new Scanner(inReader); 

    while (scan.hasNext()) { 
     String s = scan.next(); 
     System.out.println("read: " + s); 
    } 

    System.out.println("END OF LINE"); 

그리고 IDE에서이 인쇄 모든 파일을. IDE 인쇄물 외부 : "END OF LINE".

 String s = new File(this.getClass().getResource("").getPath()).getParent().replaceAll("(!|file:\\\\)", ""); 
     JarFile jar = new JarFile(s); 

      JarEntry entry = jar.getJarEntry("resources"); 

     if (entry != null){ 
      System.out.println("EXISTS"); 
      System.out.println(entry.getSize()); 
     } 

내가 그 문자열에해야 할 일을했을 어떤 끔찍한 코딩의 :

지금, 나는이 너무과 함께 항아리 내부 항목을 찾을 수 있습니다.

어쨌든 ... Jar 내의 "resources"디렉토리 안에있는 자원 목록을 가져올 수 없습니다. 어떻게하면됩니까? ???

답변

7

먼저 Jar 파일의 내용을 열거하지 않고 필터링 된 내부 리소스 목록을 얻는 방법은 없습니다.

운 좋게도 실제로 그렇게 힘들지는 않습니다. (운 좋게도 당신은 대부분의 힘든 일을했습니다.)

기본적으로 JarFile에 대한 참조가 있으면 'entries'을 요청하고 해당 목록을 반복해야합니다. 필요한 경기 (즉 resources), 당신은 당신이 원하는 요소를 필터링 할 수 있습니다에 대한 JarEntry 이름을 확인하여

... 예를 들어

...

import java.io.File; 
import java.io.IOException; 
import java.util.Enumeration; 
import java.util.jar.JarEntry; 
import java.util.jar.JarFile; 

public class ReadMyResources { 

    public static void main(String[] args) { 
     new ReadMyResources(); 
    } 

    public ReadMyResources() { 
     JarFile jf = null; 
     try {    
      String s = new File(this.getClass().getResource("").getPath()).getParent().replaceAll("(!|file:\\\\)", ""); 
      jf = new JarFile(s); 

      Enumeration<JarEntry> entries = jf.entries(); 
      while (entries.hasMoreElements()) { 
       JarEntry je = entries.nextElement(); 
       if (je.getName().startsWith("resources")) { 
        System.out.println(je.getName()); 
       } 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } finally { 
      try { 
       jf.close(); 
      } catch (Exception e) { 
      } 
     } 
    } 

} 

주의 할

이 유형의 질문은 실제로 조금 묻습니다. Jar의 내용을 런타임에 읽으려고 시도하는 대신 사용 가능한 자원 목록이 들어있는 일종의 텍스트 파일을 만드는 것이 좋습니다.

Jar 파일을 만들기 전에 동적으로 빌드 프로세스에서 생성 할 수 있습니다. 이 파일을 (예를 들어 getClass().getResource()을 통해) 읽은 다음 텍스트 파일의 각 리소스 목록을 조회하면 훨씬 간단한 솔루션이 될 것입니다 ... IMHO

+0

답변과 마지막 의견을 보내 주셔서 감사합니다. 아이러니하게도, 나는 답을 읽기 위해 여기에 오기 전에 같은 해결책을 찾았습니다. 그렇다면 가장 좋은 방법이라고 생각합니다. 또 다른 방법은 임시 폴더에서 런타임에 읽을 필요가있는 모든 리소스가있는 임시 폴더를 만드는 것입니다. – Jh62

+1

외부 리소스로 리소스를 사용하는 것이 더 쉬운 솔루션이라고 저는 말할 것입니다. "파일 목록"솔루션을 사용하면 실제로 여러 Jar에 여러 리소스 목록 (동일한 항목 포함)을 배포 할 수 있습니다.이것들을 병합해야하지만, 실제로 저장되어있는 곳을 모른 채로 여러 개의 Jars에있는 리소스에 액세스 할 수 있습니다. – MadProgrammer

+0

@MadProgrammer, 빌드하는 동안 모든 파일을 나열하는 링크를 제공하십시오. 방법? – supertonsky

관련 문제