ObjectOutputStream en Java peut être utilisé pour convertir un objet en OutputStream. Le processus de conversion d’objet en flux est appelé sérialisation en java. Une fois qu’un objet est converti en flux de sortie, il peut être enregistré dans un fichier ou une base de données, envoyé sur le réseau ou utilisé dans des connexions socket. Ainsi, nous pouvons utiliser FileOutputStream pour écrire un objet dans un fichier.
ObjectOutputStream
ObjectOutputStream fait partie des classes Java IO et son but principal est de nous fournir un moyen de convertir un objet Java en un flux. Lorsque nous créons une instance de ObjectOutputStream, nous devons fournir le OutputStream à utiliser. Ce OutputStream est ensuite utilisé par ObjectOutputStream pour acheminer le flux d’objet vers le flux de sortie sous-jacent, par exemple, FileOutputStream.
Exigences ObjectOutputStream
L’objet que nous voulons sérialiser doit implémenter l’interface java.io.Serializable
. Serializable est simplement une interface marqueur et n’a pas de méthode abstraite que nous devons implémenter. Nous obtiendrons java.io.NotSerializableException
si la classe ne met pas en œuvre l’interface Serializable. Quelque chose comme ci-dessous exception stack trace.
java.io.NotSerializableException: com.journaldev.files.EmployeeObject
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at com.journaldev.files.ObjectOutputStreamExample.main(ObjectOutputStreamExample.java:21)
Exemple de ObjectOutputStream Java pour écrire un objet dans un fichier
Jetons un coup d’œil à un exemple de ObjectOutputStream Java pour écrire un objet dans un fichier. Pour cela, tout d’abord, nous devrions avoir une classe avec quelques propriétés. Créons un objet que nous enregistrerons dans le fichier.
package com.journaldev.files;
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = -299482035708790407L;
private String name;
private String gender;
private int age;
private String role;
// private transient String role;
public Employee(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;
}
}
Remarquez qu’il n’est pas obligatoire d’avoir des getter/setter pour toutes les propriétés. Ou d’avoir un constructeur sans argument. Comme vous pouvez le voir, l’objet Employee ci-dessus n’a pas de méthodes getter/setter pour la propriété « name ». Il n’a pas non plus de constructeur sans argument. Voici le programme montrant comment écrire un objet dans un fichier en Java en utilisant ObjectOutputStream.
package com.journaldev.files;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class ObjectOutputStreamExample {
public static void main(String[] args) {
Employee emp = new Employee("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);
// écrire l'objet dans le fichier
oos.writeObject(emp);
System.out.println("Done");
// fermeture des ressources
oos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ci-dessous, l’image montre la sortie du programme ci-dessus. Si vous vous demandez quel est le contenu du fichier EmployeeObject.ser
, c’est un peu confus et quelque chose comme ci-dessous.
��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO
ObjectOutputStream avec un transient
Si nous ne voulons pas que certaines propriétés de l’objet soient converties en flux, nous devons utiliser le mot-clé transient pour cela. Par exemple, il suffit de changer la propriété du rôle comme ci-dessous et elle ne sera pas sauvegardée.
private transient String role;
ObjectOutputStream et serialVersionUID
Avez-vous remarqué le serialVersionUID
défini dans l’objet Employee ? Il est utilisé par les classes ObjectOutputStream
et ObjectInputStream
pour les opérations d’écriture et de lecture d’objets. Bien qu’il ne soit pas obligatoire d’avoir ce champ, vous devriez le conserver. Sinon, chaque fois que vous modifiez votre classe sans effet sur les objets sérialisés précédents, cela commencera à échouer. Pour une analyse détaillée, consultez La sérialisation en Java. Si vous vous demandez si notre programme a bien fonctionné ou non, utilisez le code ci-dessous pour lire un objet à partir du fichier enregistré.
FileInputStream is = new FileInputStream("EmployeeObject.ser");
ObjectInputStream ois = new ObjectInputStream(is);
Employee emp = (Employee) ois.readObject();
ois.close();
is.close();
System.out.println(emp.toString());
//La sortie sera "Employé:: Nom=Pankaj Âge=35 Sexe=Mâle Rôle=PDG"
C’est tout sur java ObjectOutputStream et comment l’utiliser pour écrire l’objet dans un fichier.
Vous pouvez consulter plus d’exemples d’E/S Java sur notre Dépôt GitHub.
Référence: Documentation de l’API
Source:
https://www.digitalocean.com/community/tutorials/objectoutputstream-java-write-object-file