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

private ArrayList clubs = new ArrayList();

通过以下方法:

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

我的程序正在运行-它允许我将新的Club对象添加到我的数组列表中,我可以查看该数组列表,还可以删除任何我想要的内容,等等。

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

我有两种方法(请参见下文),并且一直在尝试使其工作,但还没有运气,任何帮助或建议都将不胜感激。

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

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之类的(对于我列表中的每个Club)

您看到的Club@c5d8jdj是Object类toString()方法的结果。 您希望列表如何保存在文件中? 什么格式?

toString()不适合写入文件。 您要序列化。

如果要这样做,则必须重写Club()类的toString()方法,以便它包含所有信息,然后包含一个能够重新创建该对象的构造方法。 或查看Serializable接口和ObjectStreams:docs.oracle.com/javase/tutorial/essential/io/objectstreams.html

我不喜欢将文件保存为哪种文件格式,只要以后可以在应用程序中加载它即可。

您应该使用Java的内置序列化机制。

要使用它,您需要执行以下操作:

将Club类声明为实现Serializable:

public class Club implements Serializable {

...

}

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

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

要从文件中读取列表,请执行以下操作:

FileInputStream fis = new FileInputStream("t.tmp");

ObjectInputStream ois = new ObjectInputStream(fis);

List clubs = (List) ois.readObject();

ois.close();

如果收到"只读文件系统"异常,则可以将"t.tmp"更改为file,其中File file = new File(getFilesDir(),"t.tmp");或File file = new File(getExternalFilesDir(null),"t.tmp");,但后者可能需要WRITE_EXTERNAL_STORAGE权限。

我想将更多项目添加到arraylist containsig文件中,我该怎么做? 然后你的答案很好

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

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

对于较小的数据集,这似乎还可以,但我非常怀疑在提供大量数据集的情况下其效率。

在Java 8中,可以将Files.write()方法与两个参数一起使用:Path和List,如下所示:

List 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);
}

这可能对你有用

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)ois.readObject();
fin.close();
}

同样,从逻辑上讲,"添加"逻辑等效于使用Set而不是List。列表可以有重复项,而集合则不能。您应该考虑使用一套。毕竟,您真的可以在同一所学校拥有2个国际象棋俱乐部吗?