을 확보 java 파일을 처리
문제
우리는 오히려 큰 복잡한 응용 프로그램에서 작성 자바에 실행되는 최고의 Gridgain 패키지입니다.문제를 내는 데는 이 응용 프로그램은 거기 앉아서 요청을 처리하기 위해 하루에 약하기 전에 모든 요청 시작 결과는 형식의 예외가 java.nio.습니다.ClosedByInterruptException.
내 가정이 응용 프로그램이 없는 것을 해제 파일을 처리하고 하루를 보낸 후에의 지속적인 사용이 그것을 밖으로 실행하고 더 이상 계속 요청을 처리하(각 요청에 필요한 독서의 여러 파일에서 각각의 그리드 노드).우리가 싸서 대부분의 우리의 파일 IO operations 클래스에서 같은이
package com.vlc.edge;
import com.vlc.common.VlcRuntimeException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public final class BufferedReaderImpl implements BufferedReader {
private java.io.BufferedReader reader;
public BufferedReaderImpl(final String source) {
this(new File(source));
}
public BufferedReaderImpl(final File source) {
try {
reader = new java.io.BufferedReader(new FileReader(source));
} catch (FileNotFoundException e) {
throw new VlcRuntimeException(e);
}
}
public BufferedReaderImpl(final Reader reader) {
this.reader = new java.io.BufferedReader(reader);
}
public String readLine() {
try {
return reader.readLine();
} catch (IOException e) {
throw new VlcRuntimeException(e);
}
}
public void close() {
try {
reader.close();
} catch (IOException e) {
throw new VlcRuntimeException(e);
}
}
}
나는 생각한 문제는 이 디자인되지 않을 명시적으로 해제 파일 핸들,나의 솔루션을 제안했다 추가하는 것입을 완료 방법은 다음과 같이
protected void finalize() throws Throwable
{
reader.close();
super.finalize();
}
는 이것을 할 것이 명시적으로 합니다.질문(마지막으로)여부는 이가 있을 가능성이 어떤 효과가 있습니다.지와 같은 클래스 java.io.BufferedReader 이미 몇 가지 메커니즘을 다루고 이러한 유형의 문제입니까?
편집:도 크게 감사하고 여기에는 것은 방법의 여부를 확인이 실제로 문제...ie 는 방법이 있을 쿼리를 실행 JVM 요청에 대한 그것의 파일을 처리 할당?
해결책
거기에 작은 지점에서 재정의 finalize()
.는 경우에는 핸들이 쓰레기 수집하고 확정,다음 그래서 인스턴스 java.io.BufferedReader
고 있습니다.
가능(에 따라 사양)는 손잡이가 쓰레기 수집하지만 완료,하지만 이것은 매우 가능성이 높습니다.
할 수 있을 사용하여 시험 PhantomReference
s 청소를 사용하지 않는 파일 핸들,그러나 내 생각하는 귀하의 인스턴스 BufferedReaderImpl
아직도 참 어딘가에서(예를들면에서 값 Map
파일 이름에서 열 손잡이)그리고 무엇이 그들을 방지하에서 폐쇄(이 경우 종료자는 도움이 되지 않습니다.)
다른 팁
종료자가 될 수 없습에 의존하는 부름을 받았습니다.그것은 좋은 방법에 대한 자원을 관리합니다.표준 구성에서 Java 를 이것은:
InputStream in = null;
try {
in = ...;
// do stuff
} catch (IOException e) {
// error
} finally {
if (in != null) { try { in.close(); } catch (Exception e) { } }
in = null;
}
할 수 있습을 감싸는 이러한 손잡이 안쪽 반지만 강력한 접근 방식이다.
Java 사양을 말한다는 것을 보장하지 않'finalize()
'실행됩니다.코드가 명시적으로 닫 FileReader
자신입니다.