2013-11-27 2 views
1

서블릿 컨테이너에서 응용 프로그램을 실행하고 있습니다. 이 응용 프로그램은 jar로 압축 된 일부 파일 템플리트에서 파생 된 글자를 생성합니다. 나는 Class.getResourceAsStrem에 의하여이 파일을 붙잡고 신청은 완벽하게 잘 작동한다.getResourceAsStream이 작동 한 후 null을 반환합니다.

그러나 수천 번의 호출 후에 메서드는 suckently null을 반환하고 응용 프로그램을 다시 시작할 때까지 null을 계속 반환합니다. 나는 이것에 대해 아무런 설명이 없으며 이것이 갑자기 일어나는 이유를 볼 수 없다.

내가 처음에는 이것이 동일한 자원을 가리키는 폐쇄되지 않은 스트림 때문일 수 있다고 생각했지만 열어 본 후 스트림 처리를 catch - try- 차단으로 포장했습니다. 또한 힙 덤프는 이러한 스트림 객체를 표시하지 않으며 나는이 결과가 IOException이되어야한다고 생각합니다. 또한, javadoc가 말한다

InputStream 객체 또는 null이 이름을 가진 자원은

발견되지 왜 응용 프로그램이 갑자기 이상이 성공적으로 전에 발견 리소스를 찾을 수 없을 것입니다 경우 .

아이디어가 있으십니까?

+0

이 파일들은 어디에 있습니까? –

+0

항아리의 하위 폴더에 있습니다. –

답변

1

이유를 찾은 것 같습니다. ClassLoader.getResourceAsStream(String)이되는 Class.getResourceAsStream 결국 대표는 다음과 같이 구현됩니다

public InputStream getResourceAsStream(String name) { 
    URL url = getResource(name); 
    try { 
     return url != null ? url.openStream() : null; 
    } catch (IOException e) { 
     return null; 
    } 
} 

은 내가 IOException이 발생하고 실제로 열려있는 파일이 유출되어있다 같아요. 그러나이 예외는 삼켜 버려서 null 포인터가 반환됩니다. Genius API ...

업데이트 : 힙 덤프를보고 파일을 누수하고있는 응용 프로그램 코드를 발견했습니다. 젠장, ClassLoader 구현, NullPointerException 님과 나를 오도하고 있습니다.

+0

'힙 덤프를보고 나서 ... '- 어떻게 얻었습니까? – MyTitle

+0

'OutputStream' 인스턴스가 닫히지 않았지만 있었어야하는 힙에있는 것을 발견했습니다. (JVisualVM 사용 : http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html)이 인스턴스를 추적하면 한 스트림이 두 번 닫히고 다른 하나는 닫히지 않는 것을 발견했습니다. 전형적인 복사 - 붙여 넣기, 나는 생각한다. –

관련 문제