0

ObjectInputStream大学のプロジェクトで使用する方法を探しています。たくさんのことを見つけましたが、なぜ成功できないのかわかりません。悪いことに、私はますます多くの警告を受けています。

ここに私の3つのクラスがあります:

public class Contact implements Comparable<Contact>
{
private String nom;
private String prenom;
private int numTel;
private static int nbContacts;
private int numContact;

public Contact(String nom, int tel) //Constructeur nom et numero
{
    System.out.println(this.numTel);
    this.numTel = tel;
    System.out.println(this.numTel);
    this.nom = nom;
    this.numContact=++nbContacts;
}

public Contact(String nom)  //Constructeur Nom
{
    this.nom = nom;
    this.numContact=++nbContacts;
}

public Contact(String nom, String prenom, int tel) //Constructeur Nom, prenom, numero
{
    this.numTel = tel;
    this.nom = nom;
    this.prenom = prenom;
    this.numContact=++nbContacts;
}

public String getNom()
{
    return this.nom;
}

public String getPrenom()
{
    return this.prenom;
}

public int getTelephone()
{
    return this.numTel;
}

public int getNumContact()
{
    return this.numContact;
}

public void setNom(String nom)
{
    this.nom = nom;
}

public void setNumTelephone(int num)
{ 
    this.numTel = num;
}

public boolean equals(Contact contact)
{
    if(!this.nom.equals(contact.getNom()))
    {
        return false;
    }
    if(this.numTel!=contact.getTelephone())
    {
        return false;
    }
    return true;
}

public int compareTo(Contact contact)
{
    return (Integer.valueOf(this.nom) - Integer.valueOf(contact.getNom()));
}   
public String toString()
{
    String s = this.numContact + ") ";
    s+= String.format ( "%-10s", "NOM : ")  + this.nom;
    if(this.prenom != null)
    {
        s+=" | " + String.format ( "%-10s", "PRENOM : " )  + this.prenom ;
    }
    if(this.numTel != 0)
    {
        s+=  " : " + this.numTel;
    }           
    s += "\n";      
    System.out.println(this.nom);
    return s;
}
}

import java.util.ArrayList;
import java.util.List;
import java.io.*;
import java.util.Collections; 
public class Repertoire 
{
    private ArrayList<Contact>alContact;

public Repertoire()
{
    alContact = new ArrayList<Contact>();
    this.getData();
}

public String toString() 
{
    String s = "";
    for ( int cpt = 0; cpt < alContact.size(); cpt++ )
    {
        s += alContact.get(cpt).toString() + "\n";
    }
    return s;
}

public void addContact(String nom, int tel) //Constructeur nom et numero
{
    alContact.add(new Contact(nom, tel));
    this.sauvegarder();
}

public void addContact(String nom)  //Constructeur Nom
{
    alContact.add(new Contact(nom));
    this.sauvegarder();
}

public void addContact(String nom, String prenom, int tel) //Constructeur Nom, prenom, numero
{
    alContact.add(new Contact(nom, prenom, tel));
    this.sauvegarder();
}


// Permet d'enregistrer dans un fichier .dat les éléments du répertoire 
private void sauvegarder()
{
    try
    {
        ObjectOutputStream out = new ObjectOutputStream ( new FileOutputStream ("Rep.txt") );
        out.writeObject ( alContact );
    }
    catch ( Exception e ) {}
}

public void getData() 
{
    FileInputStream fis = null;
    ObjectInputStream in = null;
    try 
    {
        fis = new FileInputStream("~/Rep.txt");
        in = new ObjectInputStream(fis);
        alContact = (ArrayList) in.readObject();
        in.close();
    } 
    catch (IOException ex) 
    {
        System.out.println("Bordel");
    } 
    catch (ClassNotFoundException ex) 
    {
        System.out.println("Gros Bordel");
    }
}
// Permet de recuperer les donnée dans un fichier txt
private boolean charger()
{
    try
    {
        System.out.println("Dedans");
        ObjectInputStream in = new ObjectInputStream ( new FileInputStream ("Rep.txt"));
        System.out.println("Dedans");
        alContact = (ArrayList<Contact>) in.readObject();
        System.out.println("Dedans");
    }
    catch ( Exception e ) 
    {
        System.out.println("Pas de fichier");   
        return false;
    }

    Collections.sort (alContact);
    return true;
}

}

そしてただのテスト

public class Test
{
    public static void main(String[] args)
    {
        int tel;
        Repertoire rep = new Repertoire();
        /*System.out.println("Entrez le numero");
        tel = Clavier.lire_int();
        rep.addContact("José", tel);
        */System.out.println(rep);
    }
}

このプログラムは電話インデックスです。インデックスを .txt/.dat に保存しようとしましたが、プログラムに入れることができません。理解できることを願っています。

4

2 に答える 2

4

/への保存/読み取りをシリアル化できるようにするには、クラスを実装する必要Contactがあります。SerializableInputObjectStreamOutputObjectStream

ObjectInputStreamのドキュメントから:

クラスは、java.io.Serializable または java.io.Externalizable インターフェースのいずれかを実装することによって、クラスがシリアライズされる方法を制御します。

Serializable インターフェースを実装すると、オブジェクトのシリアライゼーションでオブジェクトの状態全体を保存および復元できるようになり、ストリームが書き込まれてから読み取られるまでの間にクラスを進化させることができます。オブジェクト間の参照を自動的にトラバースし、グラフ全体を保存および復元します。

Repertoire#getDataプログラムで を実行し、ファイルが空の場合、データはまったくロードされないことに注意してください。そのため、最初にいくつかのデータを保存することをお勧めします。これを実行して、いくつかのデータを追加できます。

public void setStartData() {
    Contact contact = new Contact("Luiggi", "Mendoza", 12345);
    List<Contact> lstContact = new ArrayList<Contact>();
    lstContact.add(contact);
    ObjectOutputStream out = null;
    try {
        out = new ObjectOutputStream(new FileOutputStream("Rep.txt"));
        out.writeObject(lstContact);
        out.flush();
    } catch (IOException e) {
        System.out.println("Error while saving data.");
        e.printStackTrace(System.out);
    } finally {
        if (out != null) {
            out.close();
        }
    }
}

追加のアドバイス:

  • staticデータをファイルに保存するとき、フィールドはシリアル化されません。
  • データはファイル内でシリアル化されるため、テキスト ファイルとして扱っても、その内容は人間が読めるテキストのようにはなりません (少なくとも Java シリアライズ可能言語を話す場合)。
  • クラスのすべての属性Serializableもシリアライズ可能である必要があります。つまり、内部にオブジェクト インスタンスがある場合、そのクラスはインターフェイスを実装する必要Serializableがあります。
  • transient修飾子を追加することで、シリアル化から属性を省略できます。
  • 重要: データを保存し、クラス定義を変更してデータをロードしようとすると、エラーが発生します。クラスをシリアル化/逆シリアル化するときは、クラスが同じ構造であることを確認してください。最後のエラーでこの問題を実行していたようです。
于 2013-03-28T16:28:46.843 に答える
0

クラス equalsでメソッドをオーバーライドした方法を見てください。パラメータの型は です。このようになるはずですContact
Object

public boolean equals(Object obj)
{
    if ( ! (obj instanceof Contact))
    return false;
    Contact contact = (Contact) obj;
    if(!this.nom.equals(contact.getNom()))
    {
        return false;
    }
    if(this.numTel!=contact.getTelephone())
    {
        return false;
    }
    return true;
}

また、クラスを定義するときにインターフェイスを実装してContactクラスを作成します。SerialzableSerializableContact

sauvegarder メソッドは次のようになります。

private void sauvegarder()
{
    ObjectOutputStream out = null;
    try
    {
        out = new ObjectOutputStream ( new FileOutputStream ("Rep.txt") );
        out.writeObject ( alContact );
    }
    catch ( Exception e ) {}
    finally
    {
      if(out!=null)
      {
        try
        {
           out.close();//close the outputstream
        }catch(Exception ex){}
      }
    }
}

そして、あなたのgetData方法は次のようになります:

public void getData() 
{
    FileInputStream fis = null;
    ObjectInputStream in = null;
    try 
    {
        fis = new FileInputStream("Rep.txt");//Why using ~/Rep.txt instead of Rep.txt?
        in = new ObjectInputStream(fis);
        alContact = (ArrayList<Contact>) in.readObject();
    } 
    catch (IOException ex) 
    {
        System.out.println("Bordel");
    } 
    catch (ClassNotFoundException ex) 
    {
        System.out.println("Gros Bordel");
    }
    finally
    {
      if(in != null)
      {
        try
        {
           in.close();
        }catch(Exception ex){}
      }
    }
}

そして、今まで何も書いていないため、存在しないファイルからデータを読み取っています。デモRepertoireでは、次の方法でコンストラクターを変更できます。

public Repertoire()
{
    alContact = new ArrayList<Contact>();
    addContact("John",879999);
    addContact("Micky",4333);
    sauvegarder();
    this.getData();
}

Contactクラス宣言を次のように変更します。

public class Contact implements Comparable<Contact>,java.io.Serializable
于 2013-03-28T16:48:28.513 に答える