====== Lectura i escriptura d'arxius a Java ====== {{tag> #FpInfor #Dam #DamMp06 #DamMp06Uf1 #DamMp06Uf01}} ---- ==== Tipus d'arxius ==== Hi ha dos tipus d’arxius: - De text: guarden dades en format text (caràcters llegibles) - Binaris: guarden dades en format binari (0s i 1s) Per llegir arxius de text fem servir dues classes: - **File**: representa una ruta al sistema de fitxers, i permet * Manipular la jerarquia d’arxius (crear arxius i carpetes, borrar, renombrar …) * Manipular els atributs dels arxius (permissos, ocultació …) - **Scanner**: permet llegir els continguts d’un arxiu, s’ha de fer amb un bucle ‘while’ i la funció ‘.nextLine()’ Exemple de lectura d'arxius de text: package FileReadWrite; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class Main { public static void main(String args[]) { int lineNumber = 1; File text = new File("./Main.java"); Scanner scnr; try { scnr = new Scanner(text); while(scnr.hasNextLine()){ String line = scnr.nextLine(); System.out.println("line " + lineNumber + " :" + line); lineNumber++; } } catch (FileNotFoundException e) { e.printStackTrace(); } } } Per escriure arxius de text fem servir dues classes: - **FileWriter**: permet accedir a arxius en mode escriptura, el mètode ‘write()’ permet escriure cadenes de caràcters. * El seu constructor accepta un segon paràmetre per afegir dades a l’arxiu - **PrintWriter**: permet escriure caràcters al fitxer (igual que en pantalla) Exemple d'escriptura d'arxius de text: import java.io.File; // Import the File class import java.io.IOException; // Import the IOException class to handle errors import java.io.FileWriter; // Import the FileWriter class import java.io.IOException; // Import the IOException class to handle errors public class MainWrite { public static void main(String[] args) { try { File myObj = new File("writefile.txt"); if (myObj.createNewFile()) { System.out.println("File created: " + myObj.getName()); } else { System.out.println("File already exists."); } } catch (IOException e) { e.printStackTrace(); } try { FileWriter myWriter = new FileWriter("writefile.txt"); myWriter.write("Files in Java might be tricky, but it is fun enough!"); myWriter.close(); System.out.println("Successfully wrote to the file."); } catch (IOException e) { e.printStackTrace(); } } } ==== Escriptura i lectura d'arxius amb dades de List ==== Per escriure arxius per guardar-hi les dades d'una llista de textos, es pot fer amb: import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; // Aquest exemple escriu els continguts // d'una List en un arxiu de text public class EscripturaArxiuList { public static void main(String args[]) { String basePath = System.getProperty("user.dir") + "/"; String filePath = basePath + "ArxiuEscriu.txt"; System.out.println(""); try { List linies = new ArrayList(); linies.add("Del xoc i la confusió apareixen les pors,"); linies.add("perills i destruccions inapreciables per la"); linies.add("majoria de la gent, per sectors específics"); linies.add("de la societat i la majoria de governants."); linies.add("La natura, a través d'huracans, terratrèmols,"); linies.add("fam i pandèmies genera xoc i confusió."); Path out = Paths.get(filePath); Files.write(out, linies, Charset.defaultCharset()); System.out.println("Llest"); } catch (IOException e) { e.printStackTrace(); } } } Per llegir arxius guardats amb el mètode anterior cap a una List: import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; // Aquest exemple llegeix un arxiu de text en una List public class LecturaArxiuList { public static void main(String args[]) { String basePath = System.getProperty("user.dir") + "/"; String filePath = basePath + "Arxiu.txt"; System.out.println(""); try { List linies = Files.readAllLines(Paths.get(filePath), StandardCharsets.UTF_8); for (int cnt = 0; cnt < linies.size(); cnt = cnt + 1) { System.out.println(linies.get(cnt)); } } catch (IOException e) { e.printStackTrace(); } } } ==== DataOutputStream i DataInputStream ==== Per guardar dades primitives de manera ordenada en arxius, hi ha les classes "**DataOutputStream**" i "**DataInputStream**". Les dades, s'han de llegir en el mateix ordre que s'han guardat. Exemple de guardar dades primitives amb "DataOutputStream": File file = new File("outin.bin"); FileOutputStream fileOutputStream = null; DataOutputStream dataOutputStream = null; try { fileOutputStream=new FileOutputStream(file); dataOutputStream=new DataOutputStream(fileOutputStream); dataOutputStream.writeInt(50); dataOutputStream.writeDouble(400.25); dataOutputStream.writeUTF(“Hola”); dataOutputStream.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if(fileOutputStream!=null){ fileOutputStream.close(); } if(dataOutputStream!=null){ dataOutputStream.close(); } } catch (Exception e) { e.printStackTrace(); } } Exemple de llegir dades primitives amb "DataInputStream": (Es llegeixen en l'ordre que s'han escrit) FileInputStream fileInputStream = null; DataInputStream dataInputStream = null; try { fileInputStream = new FileInputStream(file); dataInputStream = new DataInputStream(fileInputStream); System.out.println(dataInputStream.readInt()); System.out.println(dataInputStream.readDouble()); System.out.println(dataInputStream.readUTF()); } catch (IOException e) { e.printStackTrace(); }finally { try { if(fileInputStream!=null){ fileInputStream.close(); } if(dataInputStream!=null){ dataInputStream.close(); } } catch (Exception e) { e.printStackTrace(); } } Cal tenir en compte que els objectes no són dades primitives i per tant no es poden guardar i llegir amb els mètodes anteriors. ==== Serialitzar ==== Serialitzar és transformar un objecte en una cadena de bytes que es poden llegir per reconstruir l’objecte original. Serialitzar permet guardar objectes JAVA en arxius o transmetre’ls a través de la xarxa. Per fer que una classe sigui serialitzable en JAVA ha de implementar: ‘**implements java.io.Serializable**’ Exemple de guardar un objecte "Serialitzable" en un arxiu binari: StreamEmployee.java import java.io.Serializable; public class StreamEmployee implements Serializable { private static final long serialVersionUID = -299482035708790407L; private String name; private String gender; private int age; private String role; public StreamEmployee(String n) { this.name = n; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } @Override public String toString() { return "Employee:: Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + " Role=" + this.role; } } StreamWriteMain.java import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.IOException; public class StreamWriteMain { public static void main(String[] args) { StreamEmployee emp = new StreamEmployee("Pankaj"); emp.setAge(35); emp.setGender("Male"); emp.setRole("CEO"); System.out.println(emp); try { FileOutputStream fos = new FileOutputStream("EmployeeObject.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(emp); System.out.println("Done"); oos.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } } Exemple de com llegir un arxiu amb un objecte serialitzat: StreamReadMain.java import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.IOException; public class StreamReadMain { public static void main(String[] args) { FileInputStream is; try { is = new FileInputStream("EmployeeObject.ser"); ObjectInputStream ois = new ObjectInputStream(is); StreamEmployee emp = (StreamEmployee) ois.readObject(); ois.close(); is.close(); System.out.println(emp.toString()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } **Nota**: Cal tenir en compte, que els objectes serialitzats només es poden llegir en la mateixa versió de Java. ==== Escriptura i lectura d'arxius amb dades de ArrayList<> d'Objectes ==== Per escriure arxius per guardar-hi les dades d'un ArrayList, es pot fer amb: import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.ArrayList; // En aquest exemples es // guarda una llista d'objectes // serializables en un arxiu binari public class EscripturaLlistes { public static void main(String args[]) { String basePath = System.getProperty("user.dir") + "/"; String filePath = basePath + "ArxiuEscriuLlistes.dat"; System.out.println(""); Objecte obj0 = new Objecte("Escriptori", "Estudiar"); Objecte obj1 = new Objecte("Telèfon", "Perdre el temps"); ArrayList llista = new ArrayList<>(); llista.add(obj0); llista.add(obj1); try { FileOutputStream fos = new FileOutputStream(filePath); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(llista.toArray(new Objecte[0])); oos.close(); fos.close(); System.out.println("Llest"); } catch (IOException e) { e.printStackTrace(); } } } Per llegir arxius guardats amb el mètode anterior cap a una ArrayList: import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.util.ArrayList; import java.util.Arrays; // En aquest exemples es // llegeix una llista d'objectes // serializables des de un arxiu binari // És pràctic guardar-ho en una llista // perquè així no cal saber quants objectes // cal llegir public class LecturaLlistes { public static void main(String args[]) { String basePath = System.getProperty("user.dir") + "/"; String filePath = basePath + "ArxiuEscriuLlistes.dat"; System.out.println(""); try { FileInputStream fis = new FileInputStream(filePath); ObjectInputStream ois = new ObjectInputStream(fis); ArrayList llista = new ArrayList<>(Arrays.asList((Objecte[]) ois.readObject())); for (int cnt = 0; cnt < llista.size(); cnt = cnt + 1) { System.out.println(llista.get(cnt)); } ois.close(); fis.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ==== Lectura i Escriptura d'Objectes de manera ordenada ==== Igualment, com amb les dades primitives, es poden guardar objectes de manera ordenada: Objecte serialitzable d'exemple. Objecte.java import java.io.Serializable; public class Objecte implements Serializable { String nom; String utilitat; Objecte (String nom, String utilitat) { this.nom = nom; this.utilitat = utilitat; } @Override public String toString () { return "Nom: " + this.nom + ", Utilitat: " + this.utilitat; } } import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; // En aquest exemple s'escriu un arxiu // binari amb objectes JAVA serializables // S'hauràn de llegir en el mateix // ordre que s'han escrit public class EscripturaObjectes { public static void main(String args[]) { String basePath = System.getProperty("user.dir") + "/"; String filePath = basePath + "ArxiuEscriuObjectes.dat"; System.out.println(""); try { FileOutputStream fos = new FileOutputStream(filePath); ObjectOutputStream oos = new ObjectOutputStream(fos); Objecte obj0 = new Objecte("Escriptori", "Estudiar"); Objecte obj1 = new Objecte("Telèfon", "Perdre el temps"); oos.writeObject(obj0); oos.writeObject(obj1); oos.close(); fos.close(); System.out.println("Llest"); } catch (IOException e) { e.printStackTrace(); } } } Per llegir els objectes guardats amb el mètode anterior: import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class LecturaObjectes { public static void main(String args[]) { String basePath = System.getProperty("user.dir") + "/"; String filePath = basePath + "ArxiuEscriuObjectes.dat"; System.out.println(""); try { FileInputStream fis = new FileInputStream(filePath); ObjectInputStream ois = new ObjectInputStream(fis); Objecte obj0 = (Objecte) ois.readObject(); Objecte obj1 = (Objecte) ois.readObject(); System.out.println(obj0); System.out.println(obj1); ois.close(); fis.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ==== Exemples ==== {{ ::java-lecturaescriptura.zip |}}