2009-06-16 5 views
5

Uso BufferedReader e PrintWriter per esaminare ciascuna riga di un file di input, modificare alcune righe e generare il risultato. Se una linea non subisce una modifica, viene semplicemente stampata come è per il file di output. Per qualche ragione, tuttavia, il processo termina prematuramente. Il codice simile a questa:Problemi con 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(); 
} 

Tuttavia, per qualche strana ragione, questo processo si conclude prematuramente (in realtà stampa un mezzo di una linea) verso la fine del mio file di input. Qualche ovvia ragione per questo? Il ciclo while viene definitivamente chiuso da null. Ed è verso la fine del mio file txt di linea 250k +. Grazie!

+0

Sei assolutamente sicuro che non si smentisce mai vengono gettati? Cosa faresti se venisse lanciata un'eccezione *? Sarebbe registrato? –

+0

Jon - non dimenticare che PrintWriter squude le eccezioni: devi usare il metodo "checkError" per vedere se ne è successo uno. – MetroidFan2002

+0

Sì, ma BufferedReader e FileReader no - così la chiamata a readLine() potrebbe essere stata generata. –

risposta

7

Dove si esegue lo svuotamento/chiusura di PrintWriter o FileOutputStream? Se il programma termina e questo non viene fatto, non tutti i risultati verranno scritti.

È necessario out.close() (possibilmente un p.flush() così?) Alla fine del processo di chiudere il flusso di output del file

+1

Chiudere è meglio che semplicemente lo svuotamento. +1 –

+1

Non dimenticare di farlo in un blocco finale nel caso ci sia un'eccezione. –

+0

Questo dovrebbe essere p.close(). p.flush() * should * non necessario ma è opportuno sapere che PrintWriter non si svuota prima che chiuda il flusso sottostante. Se quel flusso ha un bug (-> non scarica a chiusura, neanche), avrai di nuovo lo stesso problema. –

1

Provare ad aggiungere un p.flush() dopo il ciclo.

1

PrintWriter non dispone dell'autoflushing abilitato, quindi è probabile che l'ultimo bit del file non venga svuotato prima che il programma termini.

Aggiunta di un p.flush() dopo il tuo ciclo dovrebbe fare il trucco.