java - 如何在具有特定所需结构的文件中读取和写入 Java ArrayList 对象

标签 java

我需要将 ArrayList 对象存储和读取到文件中,这本身不是问题。我需要以特定格式存储它,并让它具有某种“ header ”,同时仍然让每个 ArrayList 对象可从文件中使用。它的另一部分是它需要通过打开文本文件本身来读取,因此不能使用序列化(除非我在如何使用序列化方面犯了严重错误)。 工作文件的外观示例如下(图 1)。

Figure 1

我将在下面包含我的所有代码,这样就不会意外显示任何重要的内容。

Airline.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);
    }

}

Passenger.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)。

Figure 1

如果有人有任何建议请告诉我!我已经被难住很久了。

此外,如果这违反了任何规则或没有正确的标签,请告诉我,我将删除/编辑它。

最佳答案

在您的示例中,您使用序列化(您可以在此处阅读更多信息 Introduction to Java Serialization ),它将对象以二进制格式保存到文件中。因此,基本上,您将整个 ArrayList 保存为字节数组,包括其内部字段和值。

但是您真正需要的只是写入文本文件。

以下是使用 java.io.PrintWriter 实现此目的的方法之一:

PrintWriter p = new PrintWriter("reservations.txt");
p.write("your text goes here");

是的,您必须准备手动书写的文本。
在您的情况下,最好的方法是覆盖 Passenger 类的 toString() 方法,这样您就可以像这样简单地写入文件:

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 字符作为分隔符.

关于java - 如何在具有特定所需结构的文件中读取和写入 Java ArrayList 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55504218/

相关文章:

java - 使用 Intent 打开 Assets 文件夹中的文件

java - 在 Elasticsearch 插件中读取文件

java - 将字符串String对象转换为可迭代的json对象

java - tomcat 给出 404 错误,而我在 xml 中的映射很好

java - 使用 Java Streams 对嵌套对象进行分组和排序

java - 使用 Java 在浏览器中下载 CSV 文件

java - 如何在 Fragments 中使用来自 Main Activity 的 API 实例?

java - Hibernate只选择一些字段并映射到Map

java - 无法在设计 View 中查看 - NetBeans

java - 在eclipse中导入javax