DAM-M3-UF5. Lectura i escriptura. Fitxers

De Wiki IES Marianao. Departament Informàtica
La revisió el 21:22, 11 set 2012 per Alex (Discussió | contribucions) (Modes d'accés)

Dreceres ràpides: navegació, cerca

torna M3 - Programació

Lectura i escriptura

Hi ha múltiples ocasions on cal introduir dades a un programa o mostra-les a la sortida, per exemple:

  • Línia de comandes
  • Formulari amb elements gràfics
  • Fitxers
  • Pipes o sockets

Java tracta la entrada i sortida d'informació establint uns corrents o fluxes (stream), a través dels quals trasllada blocs de dades (buffer).

Aquests fluxes sempre són binaris evidentment, però Java ofereix dos possibles tractaments:

  • Fluxe binari (bytes), classes InputStream, outputStream
  • Fluxe de caràcters , classes Reader, Writer


Mètodes bàsics

A través de la entrada i sortida estàndard

  • System.in, és un fluxe binari (InputStream), que recull les dades entrades per consola
  • System.out, és un fluxe binari (OutputStream -> PrintStream) amb algunes funcionalitats de tractament, converteix caràcters a bytes segons codificació de la plataforma.


La classe Scanner

La classe Scanner és una funció d'utilitat simple per a la lectura de dades tipus primitius (int, String, etc...) o qualsevol Objecte que implementi Readable.

Trenca la lectura segons el delimitador (Per defecte un espai en blanc, encara que es pot modificar)

        Scanner sc = new Scanner( System.in );

        System.out.print( "Escriu un text: " );
        String dada = sc.next();
        System.out.println( "Has escrit: " + dada);


A més implementa la interface Iterator de manera que permet gestionar la lectura amb les operacions de control dels iteradors

  • hasNext()
  • next()
        do {
            System.out.print( "Escriu \"Fi\" per acabar: " );
            dada = sc.next();
           
        } while (!dada.equals("Fi"));

També permet definir diferents tipus d'entrada com fitxers o cadenes de text, i té mètodes específics per a la lectura d'enters, decimals, etc...


        String dada = "aaa bbb ccc ddd";
        Scanner sc = new Scanner(dada);
        do {
            dada = sc.next();
            System.out.println( "Conté: " + dada);           
        } while (sc.hasNext());

        dada = "1 2 3 4";
        Scanner sc = new Scanner(dada);
        do {
            System.out.println( "Conté: " + sc.nextInt());           
        } while (sc.hasNextInt());


Readers / Writers

A part dels sistemes anteriors, Java proporciona una capa d'utilitats entre la entrada i l'usuari que permet fer un tractament semblant independentment del tipus d'entrada o sortida que es faci servir.

Les classes utilitzades per al tractament de fluxes de caràcters hereten de java.io.Reader i de Java.io.Writer


Exemple lectura de consola, obliga a gestionar les excepcions

public static void main(String[] args) throws IOException {
        //primer();

        InputStreamReader is = new InputStreamReader(System.in);        // Entrada, estandard

        BufferedReader in = new BufferedReader(is);            // buffer   

        String text = in.readLine(); //Lectura String
       
        int num = Integer.parseInt(in.readLine()); //Lectura Enter
        ...
}

Exemple entrada de fitxers, observar que també usa la classe BufferedReader, una vegada inicialitzat aquest el tractament és independent del tipus d'entrada.

        File fitxer = new File("nom");    // Adreçament relatiu   
        FileReader fr = null;        // Entrada
        BufferedReader br;            // buffer   
        String linea;

        try {
            fr = new FileReader (fitxer); // Inicialitza entrada del fitxer
            br = new BufferedReader(fr);     // Inicialitza buffer amb l’entrada
            while((linea=br.readLine())!=null)  {
                System.out.println(linea);
            }
        } catch (FileNotFoundException e) {
            System.out.println("Fitxer no existeix");
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } finally {
            if (fr != null) fr.close();
        }


Exemple escriptura a fitxer

        boolean append = true;
        FileWriter fw = new FileWriter("nom", append);
        PrintWriter pw = new PrintWriter(fw, true);
         
        try {
            int i = 0;
            while (i < 10) {
                pw.println("linia " + i++);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            fw.close();
        }


Fitxers

Classe File

La classe File permet treballar amb fitxers i directoris.


        File f = new File("fitxer");
       
        if (f.exists()) System.out.println("el fitxer existeix");
        else {
            System.out.println("el fitxer NO existeix, el creem");
            f.createNewFile();
        }
       
        System.out.println("path: " + f.getPath());    // fitxer
        System.out.println("path absolut: " + f.getAbsolutePath()); // {path_to_file}/fitxer
        System.out.println("ultima modificació : " + new Date((long)f.lastModified()*1000));
        System.out.println("longitud : " + f.length());
       
        f.setExecutable(true);
       
        if (f.canExecute()) System.out.println("execució");
        if (f.canRead()) System.out.println("lectura");
        if (f.canWrite()) System.out.println("escriptura");
        if (f.isFile()) System.out.println("fitxer");
        if (f.isDirectory()) System.out.println("directori");
        if (f.isHidden()) System.out.println("ocult");
       
        File d = new File("directori");
        if (d.exists()) System.out.println("el directori existeix");
        else {
            System.out.println("el directori NO existeix, el creem");
            d.mkdir();
        }
        if (d.isDirectory()) System.out.println("directori");
       
        String[] fitxers = d.list();
        for (int i = 0; i < fitxers.length; i++) {
            System.out.println("fitxer " + fitxers[i]);   
        }

Emmagatzematge d'objectes

Dues possibilitats:

  • Serialització i emmagatzematge (dades en binari)
  • Emmagatzematge estructurat, per exemple XML, dades tipus text

http://java.sun.com/products/jfc/tsc/articles/persistence3/