2012-12-27 2 views
0

방금 ​​발견 한 (JLayer) 깔끔한 라이브러리를 사용하여 mp3 파일을 재생하려고하는데이 코드로 컴파일하면 (Netbeans에서) 올바르게 작동합니다.파일 입력 스트림이 컴파일러에서 제대로 작동하지만 빌드 후 작동하지 않습니다.

ClassLoader cl = this.getClass().getClassLoader(); 
url = cl.getResource("music/45.mp3"); 
pin = new FileInputStream(url.getFile()); 
p = new Player(pin); 
p.play(); 

내 프로젝트를 빌드하고 실행 가능한 jar를 실행하려고했습니다. 내 프로그램이 실행 중임을 시각적으로 볼 수 있도록 JFrame을 확장했습니다. 프레임은 실행되면 나타나지만 소리는 나지 않습니다. 클래스 로더를 사용하면이 문제가 해결되지만 행운은 없습니다. 도와 주시면 대단히 감사하겠습니다!

답변

1

jar 파일에있을 수있는 리소스가있을 때 FileInputStream을 사용하지 마십시오. ClassLoader.gerResourceAsStream 또는 Class.getResourceAsStream을 사용하십시오. 그게 그들이 그곳에있는 이유입니다. 이라는 별개의 파일이 디스크에 없기 때문에 FileInputStream을 사용하려고해도 무의미합니다.

(물론, 당신은 가 제대로 자원을 사용할 수 있도록하지 않는 것을 알 수 있습니다 -하지만 그건 별개의 문제입니다.)

그래서 그냥 사용

Player p = new Player(getClass().getResourceAsStream("/music/45.mp3")); 
p.play(); 

(에서 당신의 코드를 사용하는 것보다 훨씬 빨리 변수를 선언하는 것처럼 보입니다. 또는 논리적으로 그냥 지역 변수로 사용해야 할 때 필드로 선언하는 것처럼 보일 수도 있습니다.주의해야 할 가치가 있습니다. 정말로 클래스 나 인스턴스의 어떤 상태를 나타 내기를 원한다. 그리고 지역 변수를 선언한다. 가능한 한 늦게 - 초기화 시점에 이상적입니다.)

+0

좋습니다. 이 상황에서 FileInputStream의 기능을 이해하기 위해서 : "player"라는 폴더에 실행 가능한 jar를 놓고 "player"라는 "player"안에 "media"라는 폴더를 추가한다고 가정 해보십시오. 그런 다음 프로그램에서 상대 위치의 jar 파일 외부에 "media"라는 폴더를 찾습니다. 그러면 FileInputStream을 적용 할 수 있습니까? –

+1

@DillonBurton : MP3 리소스 *가 파일이 아니기 때문에 아니요. 그것은 jar 파일 안에 들어 있습니다. 'FileInputStream'은 디스크 내의 파일로부터 데이터를 읽습니다. –

+0

정말 문제가 해결되었습니다. 고마워요 +1. –