Questo è sbagliato per diversi motivi ma il più importante è questo: ad un certo punto le righe finiscono e readLine() a quel punto restituirà null (per indicare end-of-stream). Questo null lo ricevi dal readLine(), lo assegni a riga e lo passi al write. Passare null al write è un errore, non accetta un null. Internamente lancia NullPointerException. Siccome non hai usato il try-finally, la eccezione fa saltare subito fuori dal main e i close NON vengono fatti.
Se la dimensione del file è inferiore alla dimensione del buffer in BufferedWriter (per default 8192) esso non ha flushato nulla e quindi il file resta troncato a 0.
Anche se tutto questo fosse corretto, ti perdi tutti i newline. readLine restituisce la riga senza il newline e il write non aggiunge nulla di suo in tal senso.
Questo tecnicamente fa la copia ma non è buono per diversi motivi:
- i close comunque non vengono fatti se read/write lanciassero una eccezione
- leggi e scrivi 1 byte per volta (l'unica cosa che salva in performance è che "sotto" hai subito uno stream buffered)
- available() raramente è utile e serve (leggi il javadoc)
- stai trattando byte ... non char, quindi non serve fare un cast a char. read/write trattano un int (considerando solo il byte "basso")
- se il file in input fosse lungo 0, siccome fai prima il read() esso ritornerebbe -1 e questo lo scrivi come byte 0xFF (quindi otterresti un file di output lungo 1 !)
Se hai più oggetti di I/O incapsulati uno nell'altro, devi solo chiudere quello più "esterno".
P.S. consiglio del tutto spassionato: visto che il titolo iniziale parla di "certificazione", non arrivare ad una certificazione con questi dubbi/lacune.![]()


Rispondi quotando