当前位置: 首页 > 知识库问答 >
问题:

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

宋臻
2023-03-14

我正在编写一个非常简单的程序GUI程序来模拟手机。“手机”有四个主要按钮:电话、通讯录、信息和应用程序。我编写了所有的GUI,在使用Contact类时遇到了一个问题,它是整个程序的主干!

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

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

这里是联系人类:

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方法上的错误(Java7问题)。我现在遇到的问题是:

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个答案

公冶威
2023-03-14

这将是太长的评论后,因此我把这作为一个答案。除了已经回答的问题之外,我想在这里补充几点我的观察。

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

您将namenumber声明为静态。它所做的是,您的类的所有实例将共享相同的namenumber。我认为所有具有相同名称号码的联系人都是非常闻所未闻和意想不到的。

public static String name, number;

所以纠正一下

public String name, number;

虽然这更像是一个警告,但是您应该向您的序列化类提供一个序列化UID。序列化运行时将一个版本号与每个序列化类关联,称为序列化UID,该版本号在反序列化过程中用于验证序列化对象的发送者和接收者是否已经加载。

public static final long serialVersionUID = 42L;

你对equals()的定义会产生问题。您正在使用==检查两个字符串的相等性,这反过来只会检查相等的引用。更好的方法是使用String中重写的equals()来比较内容。

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

一旦为Contact类重写了equals(),也就重写了它的hashCode()。

尹承泽
2023-03-14

恐怕我真的理解您想要实现的目标,但我可以在您的代码中看到两个问题:

  1. 您已经使用静态属性创建了Contact类,这意味着所有对象都将共享相同的name值

公共静态字符串名称、编号;

你班上的第二个问题是,你把联系人列表也放在了里面。你让这门课变得可系列化了。这意味着每次序列化contact对象时,arraylist也会随之序列化,我认为这是不需要的。您应该创建另一个类,并将其命名为ContactsCollection,只需在其中创建一个Arraylist,您可以选择在此处使用静态Arraylist。

在您的图形用户界面中,如果您正在创建和对象,那么创建一个联系人实例。然后简单地将其添加到您的ConrectsCollection.contactList()中。您也可以在ConrectsColleciton类中添加序列化的方法。您可以选择在ConrectsCollection中使用一个方法,将参数作为联系人对象。首先在列表中添加对象,然后序列化它。

燕英奕
2023-03-14

添加到列表就像添加list一样简单。添加(联系人)

向序列化写入:

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();
}
 类似资料:
  • 问题内容: 我正在为Android设计一个手写应用程序。 每当用户按下Enter键时,我都希望将信息()写入日志文件。 之后,我想读取存储的信息。 这是我的类的一部分,带有自定义的write方法: 这是读取方法: 当我在文件中仅保存一个对象时,它会很好地工作。当我尝试节省更多时,阅读不起作用(抛出)。 它在while循环中仅读取一个对象! 在主类中,我仅使用两种简单的方法: 定义为: 请求的更新:

  • 问题内容: 我将多个对象写入文件,然后在代码的另一部分中检索它们。我的代码没有错误,但是无法正常工作。您能帮我发现我的代码有什么问题吗?我从不同的网站阅读了不同的代码,但是没有一个对我有用! 这是将对象写入文件的代码:MyClassList是一个数组列表,其中包含我的类的对象(必须将其写入文件)。 我向输出流的构造函数添加了“ true”,因为我想将每个对象都添加到文件的末尾。那是对的吗? 这是我

  • } PS,arrayList中的内容插入到程序中的某个点,因此arrayList不是空的。

  • 问题内容: 我正在用Java编写一个程序,该程序显示了一系列课后俱乐部(例如,EG Football,曲棍球-由用户输入)。俱乐部被添加到以下: 通过以下方法: ‘Club’是一个带有构造函数的类-名称: 我的程序正在运行-它使我可以将新的Club对象添加到我的数组列表中,可以查看该数组列表,还可以删除所需的任何内容,等等。 但是,我现在想将该arrayList(俱乐部)保存到文件中,然后我希望以

  • 我试图将包含Contact类型的序列化对象的文件读入ArrayList ContactsCollection。我遇到的问题是联系的对象从未添加到ArrayList中。

  • 本文向大家介绍利用PHPExcel实现Excel文件的写入和读取,包括了利用PHPExcel实现Excel文件的写入和读取的使用技巧和注意事项,需要的朋友参考一下 作为一个原本的Java党,用过PHP才知道,原来对于Excel文件的写入和读取原来可以这么简单! 利用PHP实现对于Excel的读取,主要借助于PHPExcel插件来完成。 PHPExcel下载地址:PHPExcel下载 一、PHPEx