java文件读写入list_关于Java:Java-如何将ArrayList写入文件,然后将该文件读取(加载)到原始ArrayList?...

我正在用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个国际象棋俱乐部吗?

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值