Quote Originariamente inviata da Frenza Visualizza il messaggio
codice:
public class NewClass1 {
    public static void main(String [] args) throws FileNotFoundException,IOException {
        String riga;
        FileReader fr = new FileReader("/home/frenz/Scrivania/file.txt");
        FileWriter fw = new FileWriter("/home/frenz/Scrivania/out.txt");
        BufferedReader br = new BufferedReader(fr);
        BufferedWriter bw = new BufferedWriter(fw);
        do{
            riga = br.readLine();
            bw.write(riga);
        }while(riga != null);
        br.close();
        bw.close();
        
        
    }
}
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.


Quote Originariamente inviata da Frenza Visualizza il messaggio
codice:
public class NewClass {
    public static void main(String [] Args) throws IOException{   
    String stringa;    
    char car;
        try{
    FileInputStream fis = new FileInputStream("/home/frenz/Scrivania/file.txt");
    BufferedInputStream bis = new BufferedInputStream(fis);
    FileOutputStream fos = new FileOutputStream("/home/frenz/Scrivania/out.txt");
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    do{
        car = (char)bis.read();
        System.out.print(car); 
        bos.write(car);
    }while(bis.available() != 0);
    bis.close();
    bos.close();
 }catch(FileNotFoundException ex) {
     System.out.println("file non esistente!");
 }
        
    }
    }
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 !)

Quote Originariamente inviata da Frenza Visualizza il messaggio
A proposito,nei programmi i close devo invocarli all'oggetto piu "esterno" o a tutti?
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.