0

我正在寻找如何ObjectInputStream用于大学项目。我发现了很多东西,但我不知道为什么我不能成功。最糟糕的是,我收到了越来越多的警告。

这是我的三门课:

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类必须实现Serializable才能可序列化以保存/读取/读取InputObjectStream/ OutputObjectStream

来自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类时Serialzable实现Serializable接口来创建Contact类。

你的 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 回答