Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    5

    Certificazione OCA/OCP Oracle - suggerimenti e dubbi

    Ciao a tutti,
    mi presento sono frenz,ho 28 anni e ho appena concluso un corso di formazione per la certificazione di cui sopra..
    Avrei però alcuni dubbi,dato che la documentazione ufficiale a volte mi mette in difficoltà..
    Ad esempio sto incontrando parecchie difficoltà con la gestione dei file (classi inputstream,buffered etc)
    sono talmente tante che non riesco proprio a capirne la logica e quando provo a creare programmini anche stupidi mi imbatto sempre in qualcosa di poco chiaro,
    le varie guide su internet non sono male,ma usandole mi allontano spesso dal percorso ufficiale oracle,che è ciò che serve per le certificazioni suppongo.
    Spero di ricevere risposte o feedback da parte di gente piu esperta e navigata
    grazie.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Java ha una sezione dedicata... Sposto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    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
    Ad esempio sto incontrando parecchie difficoltà con la gestione dei file (classi inputstream,buffered etc)
    sono talmente tante che non riesco proprio a capirne la logica
    A parte alcune classi particolari (es. File o RandomAccessFile), praticamente tutte le altre classi di I/O nel package java.io sono modellate sul noto design pattern "Decorator". Questo pattern descrive una architettura in cui c'è un tipo base da cui derivano due tipologie di classi: i "componenti" e i "decoratori". I componenti sono classi che fanno un lavoro ben preciso e finito. I decoratori invece sono classi che incapsulano un altro oggetto (un componente o a sua volta un decoratore) al fine di "decorarlo" per aggiungere del comportamento in più a runtime.
    In quest'ottica purtroppo vengono tipicamente fuori un gran numero di classi, perché ogni classe è focalizzata generalmente su un solo e unico aspetto. Se cerchi una singola classe che es. legge da file, bufferizza e fornisce "righe" ... NON la trovi.

    FileReader è un "componente" (nel pattern Decorator), sa solo leggere caratteri da file, non "incapsula" un altro oggetto di I/O, non sa bufferizzare né fare altro. Mentre BufferedReader è un "decoratore", esso è-un Reader e incapsula un altro Reader (basta vedere i costruttori di BufferedReader). Non sa leggere da file ma sa come bufferizzare l'input e estrarre righe.
    Quindi se vuoi leggere da file (usando il charset predefinito) E vuoi bufferizzare potendo leggere anche "a righe", devi istanziare un FileReader, poi incapsularlo in un BufferedReader e usare quest'ultimo.

    Una volta che ti è chiaro il concetto del Decorator ... tutto ti apparirà più chiaro e logico.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    5
    ok grazie mille...in realtà il concetto a furia di ripetere e fare tentativi l'ho elaborato,ma ad esempio per quale motivo questo semplice programma per copiare un file di testo in un altro file di testo,funge nel leggere da file (provato con un println nel ciclo do-while) ma non scrive assolutamente nulla nel file di output?
    non è giusto usare gli stream di caratteri?
    se la logica che ho usato per le classi reader è uguale a quella delle classi stream writer,perchè uno funge e l'altro no?
    di seguito il listato:

    public class NewClass {
    public static void main(String [] Args) throws IOException{
    String stringa;
    try{
    InputStreamReader isr = new FileReader("/home/frenz/Scrivania/file");
    BufferedReader br = new BufferedReader(isr);
    OutputStreamWriter osw = new FileWriter("/home/frenz/Scrivania/out");
    BufferedWriter bw = new BufferedWriter(osw);
    PrintWriter pw = new PrintWriter(bw); /* aggiunto dopo ma senza miglioramenti*/
    do{
    pw.print(br.readLine()); /* come sopra*/
    bw.write(br.readLine());
    }while (br.read()!= -1);


    }catch(FileNotFoundException ex) {
    System.out.println("file non esistente!");
    }

    }
    }

    Grazie mille per l'appoggio!

  5. #5
    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
    non è giusto usare gli stream di caratteri?
    Per copiare file pari pari, senza alcuna nozione sul contenuto, sarebbero meglio gli Stream (orientati ai byte) ... non i Reader/Writer (orientati ai caratteri).

    Comunque il tuo codice è sbagliato e per svariati motivi!
    - Se proprio si volesse usare readLine(), si dovrebbe testare il suo valore di ritorno. L'idioma tipico d'uso del readLine() è dentro un ciclo while nella cui espressione di test si assegna ad una variabile ed allo stesso tempo si testa per diverso da null.
    - Se anche usi readLine(), dovresti scrivere esplicitamente un newline (nel tuo codice i newline li perdi!)
    - quel br.read()!= -1 non ha senso messo lì così
    - cosa importantissima, mancano i close, che vanno sempre fatti (anche quando una lettura/scrittura lancia una eccezione).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    5
    ok ok,ma anche fatte le modifiche del caso il programma legge correttamente,crea il file di output ma lo lascia vuoto!
    considera che ho provato inizialmente con un programma di una sola riga,giusto per impratichirmi..
    il problema è proprio questo,PERCHE' se uso le 2 classi di caratteri,una funziona perfettamente e l'altra non collabora?!
    eppure la teoria cita che è importante wrappare e swrappare usando possibilmente le stesse classi e controclassi di read e write.

  7. #7
    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
    ok ok,ma anche fatte le modifiche del caso il programma legge correttamente,crea il file di output ma lo lascia vuoto!
    E quindi che codice hai scritto ora? Mostralo. Ti ripeto che per copiare pari-pari un file sarebbero meglio gli Stream ma anche con i Reader/Writer si può tecnicamente fare. Non è quello il problema. L'unica problematica in più è che entra in gioco la nozione di set di caratteri, perché ci deve essere una (de)codifica tra sequenze di byte e sequenze di char.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    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

  9. #9
    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, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    5
    grazie mille per le dritte ,ma guarda se dovessi leggere il manuale oracle ufficiale molti dettagli da te citati non emergono proprio...sono un pò superficiali su alcune cose..:\
    comunque già che ci sono,qualcuno ha già preso una certificazione oca o ocp?
    se si,sapreste consigliarmi cosa coltivare in particolar modo?

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 © 2025 vBulletin Solutions, Inc. All rights reserved.