bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


java_lectura_escriptura

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
java_lectura_escriptura [2022/11/24 15:57]
albert_palacios_jimenez
java_lectura_escriptura [2022/11/24 17:02] (actual)
albert_palacios_jimenez
Línia 1: Línia 1:
 ====== Lectura i escriptura d'arxius a Java ====== ====== Lectura i escriptura d'arxius a Java ======
  
-{{tag> #FpInfor #Dam #DamMp06 #DamMp06Uf1 #DamMp06Uf01 }}+{{tag> #FpInfor #Dam #DamMp06 #DamMp06Uf1 #DamMp06Uf01}}
  
 ---- ----
Línia 10: Línia 10:
  
 - De text: guarden dades en format text (caràcters llegibles) - De text: guarden dades en format text (caràcters llegibles)
 +
 - Binaris: guarden dades en format binari (0s i 1s) - Binaris: guarden dades en format binari (0s i 1s)
  
 Per llegir arxius de text fem servir dues classes: Per llegir arxius de text fem servir dues classes:
  
-- **File**: representa una ruta al sistema de fitxers+- **File**: representa una ruta al sistema de fitxers, i permet
  
   * Manipular la jerarquia d’arxius (crear arxius i carpetes, borrar, renombrar …)   * Manipular la jerarquia d’arxius (crear arxius i carpetes, borrar, renombrar …)
Línia 85: Línia 86:
 </code> </code>
  
-==== Serialitzar ==== 
  
 +==== Escriptura i lectura d'arxius amb dades de List<String> ====
  
-Serialitzar és transformar un objecte en una cadena de bytes que es poden llegir per reconstruir l’objecte original.+Per escriure arxius per guardar-hi les dades d'una llista de textos, es pot fer amb:
  
-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 
 <code java> <code java>
-import java.io.Serializable;+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;
  
-public class StreamEmployee implements Serializable {+// Aquest exemple escriu els continguts 
 +// d'una List<String> en un arxiu de text
  
-   private static final long serialVersionUID = -299482035708790407L; +public class EscripturaArxiuList { 
-   private String name; +    public static void main(String args[]) { 
-   private String gender+        String basePath = System.getProperty("user.dir") + "/"
-   private int age; +        String filePath = basePath + "ArxiuEscriu.txt";
-   private String role;+
  
-   public StreamEmployee(String n) { this.name = n; } +        System.out.println("");
-   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; +
-   } +
-}+
  
-</code>+        try { 
 +            List<Stringlinies = 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ó.");
  
-StreamWriteMain.java +            Path out = Paths.get(filePath)
-<code java> +            Files.write(out, linies, Charset.defaultCharset());
-import java.io.FileOutputStream; +
-import java.io.ObjectOutputStream+
-import java.io.IOException;+
  
-public class StreamWriteMain { +            System.out.println("Llest");
-   public static void main(String[] args{+
  
-       StreamEmployee emp = new StreamEmployee("Pankaj"); +        } catch (IOException e) { e.printStackTrace();
- +    }
-       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();+
-   }+
 } }
 </code> </code>
  
-Exemple de com llegir un arxiu amb un objecte serialitzat:+Per llegir arxius guardats amb el mètode anterior cap a una List<String>:
  
-StreamReadMain.java 
 <code java> <code 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; import java.io.IOException;
 +import java.nio.charset.StandardCharsets;
 +import java.nio.file.Files;
 +import java.nio.file.Paths;
 +import java.util.List;
  
-public class StreamReadMain { +// Aquest exemple llegeix un arxiu de text en una List<String>
-   public static void main(String[] args) {+
  
-       FileInputStream is; +public class LecturaArxiuList { 
-       try +    public static void main(String args[]) 
-           is new FileInputStream("EmployeeObject.ser"); +        String basePath System.getProperty("user.dir"+ "/"
-           ObjectInputStream ois new ObjectInputStream(is); +        String filePath basePath + "Arxiu.txt";
-           StreamEmployee emp = (StreamEmployee) ois.readObject();+
  
-           ois.close(); +        System.out.println(""); 
-           is.close(); + 
-           System.out.println(emp.toString()); +        try { 
-       catch (ClassNotFoundException e) { +            List<String> linies = Files.readAllLines(Paths.get(filePath), StandardCharsets.UTF_8); 
-           e.printStackTrace(); +            for (int cnt = 0; cnt < linies.size(); cnt = cnt + 1) { 
-       } catch (IOException e) { e.printStackTrace();+                System.out.println(linies.get(cnt)); 
-   }+            
 +        } catch (IOException e) { e.printStackTrace();
 + 
 +    }
 } }
 </code> </code>
  
-**Nota**: Cal tenir en compte, que els objectes serialitzats només es poden llegir en la mateixa versió de Java. 
  
 ==== DataOutputStream i DataInputStream ==== ==== DataOutputStream i DataInputStream ====
Línia 239: Línia 215:
 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. 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.
  
-==== Escriptura i lectura d'arxius amb dades de List<String> ==== 
  
-Per escriure arxius per guardar-hi les dades d'una llista de textos, es pot fer amb:+==== 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
 <code java> <code java>
-import java.io.IOException; +import java.io.Serializable;
-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 +public class StreamEmployee implements Serializable {
-// d'una List<String> en un arxiu de text+
  
-public class EscripturaArxiuList { +   private static final long serialVersionUID = -299482035708790407L; 
-    public static void main(String args[]) { +   private String name; 
-        String basePath = System.getProperty("user.dir") + "/"+   private String gender
-        String filePath = basePath + "ArxiuEscriu.txt";+   private int age; 
 +   private String role;
  
-        System.out.println("");+   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; 
 +   } 
 +}
  
-        try { +</code>
-            List<Stringlinies = 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)+StreamWriteMain.java 
-            Files.write(out, linies, Charset.defaultCharset());+<code java> 
 +import java.io.FileOutputStream; 
 +import java.io.ObjectOutputStream
 +import java.io.IOException;
  
-            System.out.println("Llest");+public class StreamWriteMain { 
 +   public static void main(String[] args{
  
-        } catch (IOException e) { e.printStackTrace();+       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();
 +   }
 } }
 </code> </code>
  
-Per llegir arxius guardats amb el mètode anterior cap a una List<String>:+Exemple de com llegir un arxiu amb un objecte serialitzat:
  
 +StreamReadMain.java
 <code java> <code 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; 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 StreamReadMain { 
 +   public static void main(String[] args) {
  
-public class LecturaArxiuList { +       FileInputStream is; 
-    public static void main(String args[]) +       try 
-        String basePath System.getProperty("user.dir"+ "/"+           is new FileInputStream("EmployeeObject.ser"); 
-        String filePath basePath + "Arxiu.txt";+           ObjectInputStream ois new ObjectInputStream(is); 
 +           StreamEmployee emp = (StreamEmployee) ois.readObject();
  
-        System.out.println(""); +           ois.close(); 
- +           is.close(); 
-        try { +           System.out.println(emp.toString()); 
-            List<String> linies = Files.readAllLines(Paths.get(filePath), StandardCharsets.UTF_8); +       catch (ClassNotFoundException e) { 
-            for (int cnt = 0; cnt < linies.size(); cnt = cnt + 1) { +           e.printStackTrace(); 
-                System.out.println(linies.get(cnt)); +       } catch (IOException e) { e.printStackTrace();
-            +   }
-        } catch (IOException e) { e.printStackTrace();+
- +
-    }+
 } }
 </code> </code>
 +
 +**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 ==== ==== Escriptura i lectura d'arxius amb dades de ArrayList<> d'Objectes ====
Línia 492: Línia 496:
     }     }
 } }
-</code> 
- 
-==== Arxius XML ==== 
- 
-Els arxius XML poden tenir un tractament especial, per tal de poder accedir directament a les dades que contenen a través del seu arbre.  
- 
-Per llegir arxius XML fem servir "DocumentBuilderFactory", per obtenir el "Document" amb les dades, per exemple: 
- 
-<code java> 
-       try { 
-           DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
-           DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
-           Document doc = dBuilder.parse(file); 
-           doc.getDocumentElement().normalize(); 
-           NodeList listStudents = doc.getElementsByTagName("student"); 
-           System.out.println("Número d'estudiants: " + listStudents.getLength()); 
-       }} catch(Exception e) { e.printStackTrace(); } 
-</code> 
- 
-En aquest exemple es veu com es poden llegir els atributs i continguts dels elements d'un arxiu XML: 
- 
-<code java> 
-for(int cnt = 0; cnt < listStudents.getLength(); cnt = cnt + 1) { 
-       Node nodeEstudiant = listStudents.item(cnt); 
-       if(nodeEstudiant.getNodeType() == nodeEstudiant.ELEMENT_NODE) { 
-               Element elm = (Element) nodeEstudiant; 
-               String txt = ""; 
-               txt = txt + "> Student "    + elm.getAttribute("id"); 
-               txt = txt + ", Name: "      + elm.getElementsByTagName("name").item(0).getTextContent(); 
-               System.out.println(txt); 
-} 
-</code> 
- 
-Cal fixar-se que es comprova que els elements siguin de tipus "ELEMENT_NODE" i no de text, per tal de poder fer el "**cast**" cap a "Element" 
- 
-Aleshores ja es poden llegir els atributs o els altres elements que tingui dins. 
- 
-== XPath == 
- 
-Per poder accedir més fàcilment als elements de l'arbre XML, es pot fer servir XPath 
- 
-<code java> 
-Document doc = dBuilder.parse(file); 
- 
-XPath xPath = XPathFactory.newInstance().newXPath(); 
-String expression = "/root/students/student[@id='id_e01']"; 
-NodeList listExpression = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET); 
- 
-Element elm = (Element) listExpression.item(0); 
-                   
-String txt = ""; 
-txt = txt + "> Student "    + elm.getAttribute("id"); 
-txt = txt + ", Name: "      + elm.getElementsByTagName("name").item(0).getTextContent(); 
- 
-System.out.println(txt); 
-</code> 
- 
-En l'exemple anterior es busquen tots els estudiants que tinguin l'atribut "id" amb valor "id_e01" 
- 
-== Generar un arbre XML amb elements i atributs == 
- 
-Aquest exemple mostra com es pot generar un arbre XML amb elements i atributs: 
- 
-<code java> 
-            
-           DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
-           DocumentBuilder db = dbf.newDocumentBuilder(); 
-           Document doc = db.newDocument(); 
-       
-           Element elmRoot = doc.createElement("note"); 
-           doc.appendChild(elmRoot); 
-       
-           Element elmTo = doc.createElement("to"); 
-           elmTo.appendChild(doc.createTextNode("John")); 
-           elmRoot.appendChild(elmTo); 
-       
-           Attr attrId = doc.createAttribute("id"); 
-           attrId.setValue("1"); 
-           elmTo.setAttributeNode(attrId); 
-</code> 
- 
-Finalment, per escriure un arbre XML com l'anterior en un arxiu: 
- 
- 
- 
-<code java> 
-    // Save a Document into an XML file 
-    static public void write (String path, Document doc) { 
-        try { 
-            TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
-            Transformer transformer = transformerFactory.newTransformer(); 
-            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
-            transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
-            trimWhitespace(doc); 
-            DOMSource source = new DOMSource(doc); 
-            StreamResult result = new StreamResult(new File(path)); 
-            transformer.transform(source, result); 
-        } catch (TransformerException e) { e.printStackTrace(); } 
-    } 
 </code> </code>
  
java_lectura_escriptura.1669305449.txt.gz · Darrera modificació: 2022/11/24 15:57 per albert_palacios_jimenez