2014-10-21 3 views
-1

파일을 읽고 내용을 BlockingQueue()에 넣었습니다.BufferedReader가 java.io.IOException을 throw합니다. 스트림이 닫혔습니다.

BlockingQueue()에서 문자열을 가져 오는 메소드가 올바르게 대기하는지 확인하려면 Thread.sleep(10)을 사용했습니다. 하지만 '스트림 닫힘'오류가 발생했습니다.

BufferedReader br = new BufferedReader(new FileReader(filePath)); 

for (String line; (line = br.readLine()) != null;) { 
    Thread.sleep(10); 
    queue.put(line); 
} 

몇 내가 가진, 읽기 후 : 여기 실수 무엇을하고 있어요된다

java.io.IOException: Stream closed 
    at java.io.BufferedReader.ensureOpen(BufferedReader.java:97) 
    at java.io.BufferedReader.readLine(BufferedReader.java:292) 
    at java.io.BufferedReader.readLine(BufferedReader.java:362) 

? BufferedReader에 대한 특정 시간 제한이 있습니까?

편집 : remiaing 부분은, 나는 다른 방법에서 병렬로 그 큐를 읽고 있습니다.

+0

'ensureOpen' 메쏘드는 기본 reader가 'null'이라면 언급 된 예외를 던지는지 검사합니다. 그리고 버퍼링 된 리더에서 close를 호출하면 이러한 일이 발생할 수 있습니다. 따라서 문제를 일으키는 코드가 더 있어야합니다. 표시된 코드 스 니펫은 이러한 결과를 가져올 수 없습니다. – Seelenvirtuose

+1

최소한의 실행 예제를 제공하십시오 (대기열의 출처와 입력 파일의 모양은 무엇입니까). 나는 재현하려고했지만 성공하지는 못했다. – shillner

+0

@shi : 위의 코드는 메서드에 있으며 다른 메서드에서 큐를 동시에 읽습니다. 사실,이 수면을 사용하여 큐가 위의 메소드로부터 입력을받을 때까지 두 번째 메소드가 대기하는지 여부를 확인합니다. – Harbinger

답변

2

그러나 '스트림 닫힘'오류가 발생했습니다.

이미 다른 스트림에서 스트림을 닫았 기 때문에이 오류가 발생했습니다.

NB 코드에서 sleep()은 무의미합니다.

+0

실제로이 대기열을 사용하여 대기열이 위의 메서드에서 일부 입력을받을 때까지 대기하는지 여부를 확인합니다. – Harbinger

+0

예. 다른 스레드에서 동일한 참조 br을 사용했습니다. 감사합니다 – Harbinger

+1

@Harbinger 왜 당신이 대기열이나 다른 스레드를 사용하고 있는지 모르겠지만, 그것이 'BlockingQueue'라면 그 동작은 스펙에 의해 보장되고, 그렇지 않으면되어야합니다. 'sleep()'을 코드에 추가하는 것이 도움이되지 않습니다. – EJP

관련 문제