Java - 如何将我的 ArrayList 写入文件,并将该文件读取(加载)到原始 ArrayList?

我正在用Java编写一个程序,该程序显示一系列课后俱乐部(例如足球,曲棍球 - 由用户输入)。俱乐部被添加到以下:ArrayList

private ArrayList<Club> clubs = new ArrayList<Club>();

通过以下方法:

public void addClub(String clubName) {
    Club club = findClub(clubName);
    if (club == null)
        clubs.add(new Club(clubName));
}

“俱乐部”是一个带有构造函数的类 - 名称:

public class Club {

    private String name;

    public Club(String name) {
        this.name = name;
    }

    //There are more methods in my program but don't affect my query..
}

我的程序正在工作 - 它允许我将一个新的俱乐部对象添加到我的数组列表中,我可以查看数组列表,我可以删除任何我想要的东西等。

但是,我现在想将该数组列表(俱乐部)保存到一个文件中,然后我希望以后能够加载该文件,并且相同的数组列表再次存在。

我有两种方法(见下文),并且一直在努力使其正常工作,但没有任何运气,任何帮助或建议将不胜感激。

保存方法(文件名由用户选择)

public void save(String fileName) throws FileNotFoundException {
    String tmp = clubs.toString();
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
    pw.write(tmp);
    pw.close();
}

加载方法(当前代码不会运行 - 文件是字符串,但需要是俱乐部?

public void load(String fileName) throws FileNotFoundException {
    FileInputStream fileIn = new FileInputStream(fileName);
    Scanner scan = new Scanner(fileIn);
    String loadedClubs = scan.next();
    clubs.add(loadedClubs);
}

我还使用GUI来运行应用程序,目前,我可以单击我的“保存”按钮,然后允许我键入名称和位置并保存它。文件显示并可以在记事本中打开,但显示为类似于Club@c5d8jdj(对于我列表中的每个俱乐部)


答案 1

您应该使用 Java 的内置序列化机制。要使用它,您需要执行以下操作:

  1. 将类声明为实现:ClubSerializable

    public class Club implements Serializable {
        ...
    }
    

    这告诉 JVM 该类可以序列化为流。您不必实现任何方法,因为这是一个标记接口。

  2. 要将列表写入文件,请执行以下操作:

    FileOutputStream fos = new FileOutputStream("t.tmp");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(clubs);
    oos.close();
    
  3. 要从文件中读取列表,请执行以下操作:

    FileInputStream fis = new FileInputStream("t.tmp");
    ObjectInputStream ois = new ObjectInputStream(fis);
    List<Club> clubs = (List<Club>) ois.readObject();
    ois.close();
    

答案 2

作为练习,我建议执行以下操作:

public void save(String fileName) throws FileNotFoundException {
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
    for (Club club : clubs)
        pw.println(club.getName());
    pw.close();
}

这会将每个俱乐部的名称写在文件的新行上。

Soccer
Chess
Football
Volleyball
...

我会把装载留给你。提示:您一次写一行,然后可以一次读一行。

Java 中的每个类都扩展了该类。因此,您可以重写其方法。在这种情况下,您应该对该方法感兴趣。在您的课程中,您可以覆盖它,以您喜欢的任何格式打印有关该课程的一些消息。ObjecttoString()Club

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

然后,您可以将上述代码更改为:

public void save(String fileName) throws FileNotFoundException {
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
    for (Club club : clubs)
         pw.println(club); // call toString() on club, like club.toString()
    pw.close();
}

推荐