2009-06-16 5 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 явно заканчивается нулем. И это к концу моего файла 250k + line 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() * should * не обязательно, но хорошо знать, что PrintWriter не очищается, прежде чем он закрывает базовый поток. Если в этом потоке есть ошибка (-> не закрывается при закрытии), у вас снова будет такая же проблема. –

1

Попробуйте добавить p.flush() после цикла.

1

PrintWriter не поддерживает автозапуск, поэтому его вероятность того, что последний бит файла не будет очищен до завершения программы.

Добавление p.flush() после того, как ваш цикл while должен сделать трюк.