Java利用ArrayList通过GUI将联系人(对象)写入和读取到文件

时间:2013-05-14 05:48:10

标签: java file-io arraylist

我正在编写一个非常简单的程序GUI程序来模拟手机。 “手机”有四个主要按钮:电话,联系人,消息和应用程序。我编写了所有的GUI并在使用Contact类时遇到了麻烦,这是整个程序的支柱!

Contact类非常简单,它有两个String类型的实例变量,分别是'name'和'number'。我想构建一个Contact类型的ArrayList,允许添加联系人,然后创建附加到序列化文件并从中读入的方法。

此时我非常关注如何创建将对象添加到arrayList的方法,然后创建附加到序列化文件并从中读取的方法。

以下是Contact类:

public class Contact
{
    public String name, number;

Contact()
{}

Contact (String theName, String theNumber)
{
    this.name = theName;
    this.number = theNumber;
}

public void setName(String aName)
{
    this.name = aName;
}

public void setNumber(String aNumber)
{
    this.number =aNumber;
}

public String getName()
{
    return name;
}

public String getNumber()
{
    return number;
}

public String toString()
{
    return name + ": " + number;
}

public boolean equals(Contact other)
{
   if (name.equals(other.getName())  && number.equals(other.getNumber()))
   {
      return( true );
   }
   else
   {
      return( false );
   }
}
}

感谢您的快速回复。我已经更正了equals方法并将ArrayList移动​​到它自己的类中。我还清除了read方法的错误(Java 7问题)。我遇到的当前问题是这些问题:

out.writeObject(contact);

Contact contact = (Contact)in.readObject();

因为我正在尝试写入和读取ArrayList,所以方法不应该反映出来吗?

import java.util.*;
import java.io.*;

class ContactsCollection implements Serializable
{
    public static final long serialVersionUID = 42L;

ArrayList <Contact> contactList = new ArrayList<Contact>();

public void write()
{
    try 
    {
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("contactList.dat"));
        out.writeObject(contact);
    } 
    catch(IOException e)
    {
        e.printStackTrace();
    }
}

public void read()
{
    try
    {
         ObjectInputStream in = new ObjectInputStream(new FileInputStream("contactList.dat"));
         Contact contact = (Contact)in.readObject();
    } 
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e)
    {
        e.printStackTrace();
    }
}
}

3 个答案:

答案 0 :(得分:2)

附加到列表就像list.add(contact)一样简单。

写入序列化:

try {
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
    out.writeObject(contact);
} catch(IOException e) {
    e.printStackTrace();
}

读:

try {
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
    Contact contact = (Contact)in.readObject();
} catch(IOException | ClassNotFoundException e ) {
    e.printStackTrace();
}

答案 1 :(得分:0)

我担心我真的明白你想要实现的目标,但我可以在你的代码中看到两个问题:

  1. 您已使用静态属性创建了Contact类,这意味着所有对象将共享相同的name&amp;值。数。它似乎有问题,我建议你在似乎不需要共享时创建非静态属性。
  2.   

    public static String name,number;

    你班上的第二个问题是,你也把联系人的arraylist放在其中。而你已经使这个班级可以连接。这意味着每次序列化您的联系对象时,您的arraylist也会与它一起序列化,我认为这是不可取的。您应该创建另一个类并将其命名为ContactsCollection,并在其中创建一个Arraylist,您可以选择在此处使用静态arraylist。

    在GUI中,如果您正在创建和对象,则创建一个Contact实例。然后简单地将它添加到ContactsCollection.contactList()中。您可以在ContactsColleciton类中添加序列化方法。您可以选择在ContactsCollection中使用单个方法,并将参数作为Contact对象。首先,在列表中添加对象,然后对其进行序列化。

答案 2 :(得分:0)

作为评论发布会太长,因此我将其作为答案发布。除了已经回答的观点之外,我想在此处添加一些观察。

您的代码中存在某些错误(如果它们是无意的):

您将namenumber声明为static。它的作用是,您的班级Contact的所有实例将共享相同的namenumber。我认为所有具有相同namenumber的联系人都是非常闻所未闻的。

public static String name, number;

所以纠正它

public String name, number;

虽然这更像是警告,但您应该为Serializable课程提供serialVersionUID序列化运行时将每个可序列化类与版本号相关联,称为serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已加载

public static final long serialVersionUID = 42L;

您对equals()的定义会产生问题。您正在使用==检查两个String的相等性,而String只检查相同的引用。更好的方法是使用被覆盖的if (name.equals(other.getName()) && number.equals(other.getNumber())) { return true; } else { return false; } equals()来比较内容。

Contact

覆盖{{1}}课程的{{1}}后,请覆盖其equals()