Appendice ObjectOutputStream : une solution avec sous-classement
L'ajout à un ObjectOutputStream peut être une tâche problématique. Comme vous l'avez découvert, le comportement par défaut d'ObjectOutputStream lors de l'écriture dans un fichier existant est de l'écraser, entraînant une perte de données.
Pour résoudre ce problème, la clé est de remplacer le comportement d'ObjectOutputStream. Plus précisément, en remplaçant la méthode writeStreamHeader, nous pouvons empêcher l'écriture de l'en-tête lors de son ajout à un fichier existant. Considérez l'exemple de code suivant :
public class AppendingObjectOutputStream extends ObjectOutputStream { public AppendingObjectOutputStream(OutputStream out) throws IOException { super(out); } @Override protected void writeStreamHeader() throws IOException { // Do not write a header reset(); // Added to fix potential issues with previous implementation } }
La sous-classe AppendingObjectOutputStream hérite de la classe ObjectOutputStream d'origine et remplace la méthode writeStreamHeader. Dans cette méthode remplacée, nous n’écrivons pas d’en-tête mais réinitialisons le flux. Cela nous permet effectivement d'ajouter des données à un fichier existant sans l'écraser.
Pour utiliser cette technique, vous pouvez vérifier si le fichier historique existe ou non. Si le fichier existe, instanciez AppendingObjectOutputStream ; sinon, utilisez le ObjectOutputStream normal. Voici une version mise à jour de votre code utilisant cette approche :
OutputStream out; if (historyFile.exists()) { out = new AppendingObjectOutputStream(new FileOutputStream(historyFile, true)); } else { out = new ObjectOutputStream(new FileOutputStream(historyFile)); } out.writeObject(new Stuff(stuff)); out.close();
En utilisant la classe AppendingObjectOutputStream lors de l'ajout à un fichier existant, vous pouvez conserver les données existantes tout en ajoutant de nouveaux objets. Cette technique vous permet de créer un magasin de données persistant qui peut croître selon vos besoins sans avoir besoin d'écrasement ou de perte de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!