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
- 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.
- 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(); } } }
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<String> 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<String> linies = new ArrayList<String>(); 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<String>:
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<String> 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<String> 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(); } } }
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 é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.
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<Objecte> 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<Objecte> 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(); } } }
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(); } } }