java - 如何在具有特定所需结构的文件中读取和写入 Java ArrayList 对象
问题描述
我需要将 ArrayList 对象存储并读取到一个文件中,这本身不是问题。我需要以特定格式存储它,并让它有一个“标题”,同时仍然让每个 ArrayList 对象都可以从文件中使用。它的另一部分是它需要通过打开文本文件本身来读取,因此不能使用序列化(除非我在如何使用序列化方面严重错误)。工作文件应如下所示的示例(图 1)。
我将在下面包含我的所有代码,这样就不会意外显示任何重要的内容。
航空公司.java
public class Airline extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Airline.fxml"));
Scene scene = new Scene(root);
stage.setTitle("Seat Reservation");
stage.setResizable(false);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
Passenger p1 = new Passenger(0001, "John Smith", "1A", "AA12");
Passenger p2 = new Passenger(0002, "Annah Smith", "1B", "AA12");
//creating arraylist
ArrayList <Passenger> pList = new ArrayList <Passenger>();
pList.add(p1);
pList.add(p2);
try {
FileOutputStream fos = new FileOutputStream(new
File("reservations.txt"));
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(pList);
oos.close();
fos.close();
FileInputStream fis = new FileInputStream(new
File("reservations.txt"));
ObjectInputStream ois = new ObjectInputStream(fis);
ArrayList list = (ArrayList) ois.readObject();
System.out.println(list.toString());
ois.close();
fis.close();
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("Error initializing stream");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
launch(args);
}
}
乘客.java
public class Passenger implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String seat;
private String flight;
Passenger() {
};
public Passenger (int idP, String nameP,String seatP, String flightP) {
this.id = idP;
this.name = nameP;
this.seat = seatP;
this.flight = flightP;
}
@Override
public String toString() {
return "\n" + id + " " + name + " " + seat + " " + flight;
}
}
我当前的代码在打开文本文件时显示了这一点(下图 2)。
如果有人有任何建议,请告诉我!我已经被难住了一段时间了。
另外,如果这违反了任何规则或没有正确的标签,请告诉我,我将删除/编辑它。
解决方案
在您的示例中,您使用序列化(您可以在这里阅读更多关于它的信息Introduction to Java Serialization),它将对象以二进制格式保存到文件中。所以基本上你将整个保存ArrayList
,包括它的内部字段和值作为字节数组。
但你真正需要的只是写入一个文本文件。
这是您可以使用的方法之一java.io.PrintWriter
:
PrintWriter p = new PrintWriter("reservations.txt");
p.write("your text goes here");
是的,您必须准备文本以手动编写。
在您的情况下,最好的方法是覆盖类toString()
的方法Passenger
,因此您可以像这样简单地写入文件:
Passenger p1 = new Passenger(0001, "John Smith", "1A", "AA12");
Passenger p2 = new Passenger(0002, "Annah Smith", "1B", "AA12");
p.write(p1.toString());
p.write(p2.toString());
toString()
方法必须连接必填字段(ID、姓名、座位号、航班号)并将它们作为单个返回,并String
以 TAB 字符作为分隔符。
推荐阅读
- c# - 将 json 反序列化为不同程序集和命名空间的字典
- sql - 更改sql中的列时出现语法错误
- angular - 使用 formcontrol.setError() 将错误传播到自定义控件组件
- c++ - C++ 的 auto 关键字是否促进了草率的编程,还是有原则性的使用它?
- c# - ListBox C# 中的可编辑 TextBox-es
- java - 成功和失败侦听器方法是否在后台线程上完成?
- javascript - 您可以在 google api 上的标记上将图像添加到内容框吗?
- java - 我无法在 recyclerview 上显示浮动操作菜单
- r - R中的奇偶一致性
- laravel - Laravel 5.x 和 7.x 认证中间件的区别