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

时间:2013-04-19 18:44:27

标签: java arraylist text-files inputstream outputstream

我正在用Java编写一个程序,它显示了一系列的课后俱乐部(E.G. Football,Hockey - 由用户输入)。俱乐部将添加到以下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));
}

'Club'是一个带有构造函数的类 - 名称:

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..
}

我的程序正在运行 - 它允许我在我的arraylist中添加一个新的Club对象,我可以查看arraylist,我可以删除任何我想要的等等。

但是,我现在想将那个arrayList(俱乐部)保存到一个文件中,然后我希望能够稍后加载该文件并再次使用相同的arraylist。

我有两种方法(见下文),并且一直试图让它工作,但没有任何帮助,任何帮助或建议将不胜感激。

保存方法(fileName由用户选择)

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

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

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(我列表中的每个俱乐部)

6 个答案:

答案 0 :(得分:65)

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

  1. Club类声明为实现Serializable

    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();
    

答案 1 :(得分:9)

作为练习,我建议做以下事项:

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中的每个类都扩展了Object类。因此,您可以覆盖其方法。在这种情况下,您应该对toString()方法感兴趣。在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();
}

答案 2 :(得分:5)

在Java 8中,您可以使用Files.write()方法和两个参数:PathList<String>,如下所示:

List<String> clubNames = clubs.stream()
    .map(Club::getName)
    .collect(Collectors.toList())

try {
    Files.write(Paths.get(fileName), clubNames);
} catch (IOException e) {
    log.error("Unable to write out names", e);
}

答案 3 :(得分:3)

这可能适合你

public void save(String fileName) throws FileNotFoundException {
FileOutputStream fout= new FileOutputStream (fileName);
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(clubs);
fout.close();
}

要回读,您可以

public void read(String fileName) throws FileNotFoundException {
FileInputStream fin= new FileInputStream (fileName);
ObjectInputStream ois = new ObjectInputStream(fin);
clubs= (ArrayList<Clubs>)ois.readObject();
fin.close();
}

答案 4 :(得分:0)

ObjectOutputStream.writeObject(clubs)
ObjectInputStream.readObject();

此外,“添加”逻辑在逻辑上等同于使用Set而不是List。列表可以有重复项,而集不能。你应该考虑使用一套。毕竟,你能在同一所学校拥有2个国际象棋俱乐部吗?

答案 5 :(得分:0)

要保存和加载的数组列表 公共静态ArrayList数据=新的ArrayList();

我曾经(写过)...

static void saveDatabase() {
try {

        FileOutputStream fos = new FileOutputStream("mydb.fil");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(data);
        oos.close();
        databaseIsSaved = true;         

    }
catch (IOException e) {
        e.printStackTrace();
}

} // End of saveDatabase

并用于(阅读)...

static void loadDatabase() {

try {           
        FileInputStream fis = new FileInputStream("mydb.fil");
        ObjectInputStream ois = new ObjectInputStream(fis);         
        data = (ArrayList<User>)ois.readObject();
        ois.close();            
    }       
catch (IOException e) {
        System.out.println("***catch ERROR***");
        e.printStackTrace();

    }       
catch (ClassNotFoundException e) {
        System.out.println("***catch ERROR***");
        e.printStackTrace();
    }   
} // End of loadDatabase