DAM-M3-UF5. Lectura i escriptura. Fitxers

De Wiki IES Marianao. Departament Informàtica
La revisió el 23:26, 6 set 2012 per Alex (Discussió | contribucions) (Readers / Writers)

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


Mètodes bàsics

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

  • System.in
  • System.out

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.

Gestiona aquestes operacions establint uns corrents o canals (stream), a través dels quals trasllada blocs de dades (buffer).

Les classes utilitzades 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();
        }