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