2010-06-13 5 views
4

Est-il possible d'écrire des objets Java dans un fichier binaire? Les objets que je veux écrire seraient 2 tableaux de String objets. La raison pour laquelle je veux faire cela est de sauvegarder les données persistantes. S'il y a un moyen plus facile de le faire, faites le moi savoir.Ecriture d'objets Java dans un fichier

+0

J'ai changé ma question parce que je suppose que je ne veux pas écrire de cours. –

+0

Plus facile que quoi? – EJP

Répondre

1

Si vous voulez écrire des tableaux de String, vous pouvez être mieux avec un fichier texte. L'avantage d'utiliser un fichier texte est qu'il peut être facilement visualisé, édité et utilisé par de nombreux autres outils de votre système, ce qui vous évite d'avoir à écrire ces outils vous-même.

Vous pouvez également constater qu'un format de texte simple sera plus rapide et plus compact que l'utilisation de XML ou JSON. Remarque: Ces formats sont plus utiles pour les structures de données complexes.

public static void writeArray(PrintStream ps, String... strings) { 
    for (String string : strings) { 
     assert !string.contains("\n") && string.length()>0; 
     ps.println(strings); 
    } 
    ps.println(); 
} 

public static String[] readArray(BufferedReader br) throws IOException { 
    List<String> strings = new ArrayList<String>(); 
    String string; 
    while((string = br.readLine()) != null) { 
     if (string.length() == 0) 
      break; 
     strings.add(string); 
    } 
    return strings.toArray(new String[strings.size()]); 
} 

Si votre départ avec

String[][] theData = { { "a0 r0", "a0 r1", "a0 r2" } {"r1 c1"} }; 

Cela pourrait entraîner

a0 r0 
a0 r1 
a0 r2 

r1 c1 

Comme vous pouvez le voir c'est facile à modifier/vue.

Cela fait des suppositions sur ce qu'une chaîne peut contenir (voir l'actif). Si ces hypothèses ne sont pas valables, il y a moyen de contourner cela.

1

Vous devez écrire un objet, pas une classe, n'est-ce pas? Parce que les classes sont déjà compilées en fichiers .class binaires.

Essayez ObjectOutputStream, il y a un exemple
http://java.sun.com/javase/6/docs/api/java/io/ObjectOutputStream.html

+0

Méfiez-vous que la sérialisation n'est pas vraiment bonne pour la persistance à long terme, voir ma réponse. – Jesper

13

Vous pouvez

  1. sérialiser les tableaux, ou une classe qui contient les tableaux.
  2. Ecrivez les tableaux sous forme de deux lignes de manière formatée , telles que JSON, XML ou CSV.

Voici un code pour la première (Vous pouvez remplacer la file d'attente avec un tableau) sérialisation

public static void main(String args[]) { 
    String[][] theData = new String[2][1]; 

    theData[0][0] = ("r0 c1"); 
    theData[1][0] = ("r1 c1"); 
    System.out.println(theData.toString()); 

    // serialize the Queue 
    System.out.println("serializing theData"); 
    try { 
     FileOutputStream fout = new FileOutputStream("thedata.dat"); 
     ObjectOutputStream oos = new ObjectOutputStream(fout); 
     oos.writeObject(theData); 
     oos.close(); 
     } 
    catch (Exception e) { e.printStackTrace(); } 
} 

Deserialize

public static void main(String args[]) { 
    String[][] theData; 

    // unserialize the Queue 
    System.out.println("unserializing theQueue"); 
    try { 
    FileInputStream fin = new FileInputStream("thedata.dat"); 
    ObjectInputStream ois = new ObjectInputStream(fin); 
    theData = (Queue) ois.readObject(); 
    ois.close(); 
    } 
    catch (Exception e) { e.printStackTrace(); } 

    System.out.println(theData.toString());  
} 

Le second est plus compliqué, mais a l'avantage d'être humain ainsi que lisible par d'autres langues.

Lecture et écriture en XML

import java.beans.XMLEncoder; 
import java.beans.XMLDecoder; 
import java.io.*; 

public class XMLSerializer { 
    public static void write(String[][] f, String filename) throws Exception{ 
     XMLEncoder encoder = 
      new XMLEncoder(
       new BufferedOutputStream(
       new FileOutputStream(filename))); 
     encoder.writeObject(f); 
     encoder.close(); 
    } 

    public static String[][] read(String filename) throws Exception { 
     XMLDecoder decoder = 
      new XMLDecoder(new BufferedInputStream(
       new FileInputStream(filename))); 
     String[][] o = (String[][])decoder.readObject(); 
     decoder.close(); 
     return o; 
    } 
} 

vers et à partir JSON

Google a une bonne bibliothèque pour convertir et de JSON à http://code.google.com/p/google-gson/ Vous pouvez simplement écrire votre objet JSON et puis écris-le dans un fichier. Pour lire faire le contraire.

+0

+1 JSON fonctionnera ici, mais attention à l'utiliser pour la sérialisation générale - il ne supporte pas les références cycliques. – mdma

+0

Il est vraiment important d'implémenter Serializable sur tous les objets liés que vous sérialisez (le cas échéant). Après l'implémentation, il vous sera demandé de générer une clé. fais-le aussi. –

2

Une possibilité en plus de la sérialisation est d'écrire des objets dans des fichiers XML pour les rendre plus lisibles. L'API XStream est capable de cela et utilise une approche similaire à la sérialisation.

http://x-stream.github.io/

2

Vous pouvez le faire en utilisant le mécanisme de Java serialization, mais méfiez-vous que la sérialisation est pas une bonne solution à long terme pour le stockage persistant des objets. La raison en est que les objets sérialisés sont très étroitement liés à votre code Java: si vous changez de programme, les fichiers de données sérialisés deviennent illisibles, car ils ne sont plus compatibles avec votre code Java. La sérialisation est bonne pour le stockage temporaire (par exemple pour un cache sur disque) ou pour le transfert d'objets sur un réseau. Pour le stockage à long terme, vous devez utiliser un format standard et bien documenté (par exemple XML, JSON ou autre) qui n'est pas étroitement couplé à votre code Java. Si, pour une raison quelconque, vous voulez absolument utiliser un format binaire, plusieurs options sont disponibles, par exemple Google protocol buffers ou Hessian.

+0

La partie qui commence par 'si vous changez de programme' n'est vraie que si vous ne définissez pas un 'serialVersionUID' et que vous enfreignez les règles spécifiées dans le chapitre Spécification de sérialisation d'objet, chapitre Versioning. – EJP

Questions connexes