2012-09-18 2 views
2

왜 다음 예외가 발생합니까? 내가하고있는 일은 거대한 ArrayList를 한 줄씩 디스크에 파일로 쓰는 것이다. 생성 된 파일은 약 700MB 이상입니다. 줄 단위로 쓴다면 문제가있는 것처럼 보입니다. 파일의 크기가 이유 일 수 있습니까? 개울은 왜 닫혀 있습니까? 그건 그렇고, 나는 윈도우 OS에서 일하고있다. 다음과 같이JAVA : IO 예외 : 이유 스트림 닫음

FileWriter evaluated_result = 
    new FileWriter(path_output+this.algorithm+"/"+query_type+"/"+"queries.eval"); 
BufferedWriter out = new BufferedWriter(evaluated_result); 
out.write(Myobject); 
out.newLine(); 
evaluated_result.close(); 
out.close(); 

는 예외입니다 :

java.io.IOException: Stream closed 
    at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45) 
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118) 
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207) 
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129) 
    at java.io.BufferedWriter.close(BufferedWriter.java:264) 
    at Assignment_1.Query_Evaluator.write100BestDocumentsEvalFormat(Query_Evaluator.java:85) 
    at Assignment_1.Experiment.ConductExperiment(Experiment.java:54) 
    at Assignment_1.Main.main(Main.java:78) 

답변

7

당신은 FileWriter을 닫는 BufferedWriter이전을 닫아야합니다.

그리고 닫는 호출은 finally 블록에 있어야합니다.

FileWriter evaluated_result = new FileWriter(path_output+this.algorithm+"/"+query_type+"/"+"queries.eval"); 
BufferedWriter out = new BufferedWriter(evaluated_result); 
try { 
    out.write(Myobject); 
    out.newLine(); 
} 
finally { 
    if (out != null) out.close(); 
    if (evaluated_result != null) evaluated_result.close(); 
} 

(더 많은 옵션에 대한 here 봐)

또한

주의 @oldrinb에서 언급 한 바와 같이, 중첩 된 스트림을 닫을 필요가 없습니다 것을 : 이것은 (마지막 하나)을 할 수있는 한 방법입니다 . 하지만 어쨌든 좋은 연습이라고 생각합니다.

Java 7을 사용하면 try-with-resources 문을 사용할 수 있습니다.

+0

FileWriter를 닫기 전에 BufferedWriter를 닫으면 내 문제를 해결할 수 있다고 생각하십니까? try-catch-finally 구조로 어떻게 정의 할 수 있습니까? – Bob

+0

@Bob : 그렇게 되길 바랍니다. 시도해보고 결과를보고하십시오 : –

+0

@Bob : 코드를 추가했습니다 ... –