2012-03-29 1 views
1

나는 이것들을 사방에 쳐다 보았다. 그러나 나는 그것을 알아낼 수 없다.JAR에 파일을 패키징 한 다음 정확한 디렉토리로 옮기기

나는 Midi 라이브러리를 사용하는 Java로 응용 프로그램을 만들고 있습니다. 이 응용 프로그램을 실행하려면 사용자는 lib/audio의 JRE 설치 폴더에 SoundBank 파일 (soundbank.gm)이 있어야합니다. 사용자가 직접 알아야 할 필요가 없으므로 사운드 뱅크를 응용 프로그램의 리소스로 패키지 할 수 있기를 바랬습니다. 응용 프로그램이 시작되면이를 올바른 디렉터리로 프로그래밍 방식으로 옮길 수있었습니다. 거기에 없었다.

먼저 JAR 에서처럼 리소스를 패키지하는 방법을 알아야합니다. 그런 다음 리소스를 다른 디렉토리에 복사하는 방법을 알아야합니다. 정상적인 파일을 복사하는 방법을 알고 있지만 JAR 파일에 액세스 할 수있는 방법을 모르겠습니다.

도움을 주시면 감사하겠습니다. 나는 이클립스 BTW를 사용하여 Runnable JAR을 내보내고있다.

편집 : 내가 방금 내 파일이 JAR에 패키지되지 않은 이유는 내가 이클립스에서 소스 폴더로 선언하지 않았기 때문이라고 생각했습니다. 이제 Java에서 해당 파일에 어떻게 액세스합니까? JAR 이름을 단순히 폴더 이름으로 처리 할 수 ​​있습니까? 자원 클래스와 같은 패키지에있는 경우

getClass().getResourseasStream("path/to/resource"); 

방금없이 자원 이름이 필요합니다 : 자원이 JAR 파일에 패키지 (또는 어디 클래스 경로에) 자바 응용 프로그램에서 사용할 수에 액세스하려면

+0

이것은 약간의 지침을 줄 수 있습니다 : http://www.cefns.nau.edu/~edo/Classes/CS477_WWW/Docs/pack_resources_in_jar.html. –

답변

2

한 직접적인 방법을 사용할 수 있습니다 스트림으로 자바 리소스에 액세스하여 원하는 곳에 복사하십시오. 예를 들어 커먼 IOUtils 유틸리티 클래스를 사용하면됩니다.

InputStream is = MyInstallerClass.class.getResourceAsStream("/path/to/my/resource"); 
OutputStream os = new FileOutputStream("/path/to/install/directory"); 
org.apache.commons.io.IOUtils.copy(is,os); 
2

리소스가 다른 패키지에 있다면 절대 경로를 사용할 수있는 모든 경로 (예 : 현재 디렉토리). Class.getResourseAsStream()에 대해서는 javadoc을 참조하십시오. 스트림을 가져 오면 스트림에서 읽을 수 있고 평소와 같이 스트림을 복사 할 수 있습니다.

1

JAR의 "resources"아래에 soundback.gm을 패키지한다고 가정 해 보겠습니다.

그런 다음 ...

ClassLoader cl = this.getClass().getClassLoader(); 
InputStream is = cl.getResourceAsStream("resources/soundback.gm"); 

그런 다음이를 통해 파일에 그의 InputStream을 변환 할 수 있습니다 ... 해당 파일에 액세스하기 위해 다음과 같은 일을

OutputStream out = new FileOutputStream(new File("/lib/audio/soundback.gm")); 

int read = 0; 
byte[] bytes = new byte[1024]; 

while ((read = is.read(bytes)) != -1) { 
    out.write(bytes, 0, read); 
} 

is.close(); 
out.flush(); 
out.close();