2009-06-16 6 views
5

BufferedReader와 PrintWriter를 사용하여 입력 파일의 각 행을 살펴보고 일부 행을 변경 한 다음 결과를 출력합니다. 한 줄이 변경되지 않으면 출력 파일에 그대로 인쇄됩니다. 그러나 어떤 이유로 프로세스가 너무 일찍 종료됩니다. 그러나, 어떤 이상한 이유로,이 과정이 조기에 종료BufferedReader/PrintWriter 문제가 있습니까?

BufferedReader in = new BufferedReader(new FileReader("in.txt")); 
FileOutputStream out = new FileOutputStream("out.txt"); 
PrintWriter p = new PrintWriter(out); 
String line = in.readLine(); 

while(line!=null) 
{ 
    if(line is special) 
     do edits and p.println(edited_line); 
    else 
     p.println(line); 

    line = in.readLine(); 
} 

(실제로는 라인의 반을 출력) 내 입력 파일의 맨 끝으로 : 코드는 다음과 같이 보입니다. 이것에 대한 명백한 이유는 무엇입니까? while 루프는 null로 끝납니다. 그리고 그것은 내 250k + 라인 txt 파일의 끝 부분입니다. 감사!

+0

는 당신이 절대적으로 확신 예외가 발생하지되고 있는가하는 파일 출력 스트림을 닫습니다? 예외가 던져지면 당신은 무엇을하겠습니까? 그것은 기록 될 것인가? –

+0

Jon - PrintWriter가 예외를 잡아 먹는 것을 잊지 마십시오. "checkError"메서드를 사용하여 예외가 발생했는지 확인해야합니다. – MetroidFan2002

+0

네,하지만 BufferedReader와 FileReader는 그렇지 않습니다 - 그래서 readLine()에 대한 호출이 발생했습니다. –

답변

7

PrintWriter 또는 FileOutputStream은 어디에서 플러시/닫기합니까? 프로그램이 종료되고 완료되지 않은 경우 모든 결과가 기록되지는 않습니다.

당신은 out.close() (아마도 p.flush()뿐만 아니라?)가 필요합니다 프로세스의 마지막에

+1

닫기는 단순히 플러시하는 것보다 낫습니다. +1 –

+1

예외가있는 경우 finally 블록에서이 작업을 수행하는 것을 잊지 마십시오. –

+0

p.close() 여야합니다. p.flush() *는 필수는 아니지만 기본 스트림을 닫기 전에 PrintWriter가 플러시되지 않는다는 것을 알아두면 좋습니다. 해당 스트림에 버그가있는 경우 (-> 닫을 때 플러시되지 않음) 동일한 문제가 다시 발생합니다. –

1

루프 다음에 p.flush()를 추가해보십시오.

1

PrintWriter에는 자동 플러싱이 활성화되어 있지 않으므로 프로그램의 종료 전에 파일의 마지막 비트가 플러시되지 않을 가능성이 있습니다.

while 루프 이후에 을 추가하면 트릭을 수행해야합니다.