Visualizzazione dei risultati da 1 a 10 su 11

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    5
    calcola che ho seguito il tuo consiglio e rifacendolo usando gli stream di byte mi è venuto su davvero facile,ma comunque questo è il code che continua a non fungere

    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 invece sarebbe lo stesso programma con gli stream di byte e funzionante:

    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!");
     }
            
        }
        }

    A proposito,nei programmi i close devo invocarli all'oggetto piu "esterno" o a tutti?
    Qui ho chiusto solo i buffered e funge.
    grazie ancora!
    Ultima modifica di LeleFT; 22-09-2015 a 08:49 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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.
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.