내가 http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html에서 아파치 공용 IOUtils.copy()
의 구현을 찾고 그것이 결국 귀결 : 내가 Executor
이를 실행하고IO에서 중단을 처리하는 우아한 방법은 무엇입니까?
public static long copyLarge(InputStream input, OutputStream output)
throws IOException {
// DEFAULT_BUFFER_SIZE is 4096
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
long count = 0;
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
, 작업 시간 초과 등이 있지만 나는 경우에도 제대로 이해한다면 이 시간이 초과되고 Future
이 취소되면이 루프의 스레드 상태에 대한 검사가 없기 때문에 스레드가 계속 실행됩니다. 이로 인해 위험한 누출과 기아가 발생합니다.
루프를 다시 작성해야하는 것처럼 보이지만이를 처리 할 수있는 제정신이고 올바른 방법은 무엇입니까? throw new IOException(new InterruptedException())
? 메서드를 던져서 InterruptedException
으로 선언하고 던져주세요 (모든 IO 도우미 메서드에 대해이 메서드를 사용하지 마십시오)?
편집 : 그냥 구아바에서 ByteStreams
을 확인하고이 같은 일을하고있는 것 같다. 이제는 왜 두 개의 주요 라이브러리가 이러한 루프에서 중단을 지원하지 않는지 궁금합니다. 내가 놓친 게 있니? 당신이 input
및/또는 output
을 닫으면
이 문제에 대한 진정한 해결책은 NIO를 사용하는 것 같습니다. 스레드 인터럽트에 적절히 반응하는 것으로 보입니다. –