从文件读取时获取存储在 objects 的 arrayList 中的不正确数据

Getting incorrect data stored inside of an arrayList of objects when reading from a file

所以我不熟悉使用 BufferedReader 从文件中读取,以及在 Java 中使用 arrayLists。我想知道为什么我的代码没有在 arrayList 内的每个 DVD object 中存储正确的数据。我最初认为它的工作方式是它从文本文件的顶部开始,读取该行,然后将该信息存储在一个变量中。完成读取双精度值后,它会根据之前找到的信息创建一张 DVD object。然后该文件将继续读取并将剩余数据存储在 arrayList 内部。但是,我在 arrayList 的开头收到了这个...

DVD 标题:剧情片,DVD 类别:130 分钟,DVD 运行时间:2002,DVD 年份:50,DVD 价格:52.0

这里有很多错误。首先,标题应该是 "Mystic River" 但它跳过了那一行,而是存储了类别 "Drama"。此外,对于文件读取过程的其余部分,年份和价格信息明显错误。在第一个条目之后,标题、类别和 运行 时间数据被适当地存储,如下所示。

DVD 标题:珠穆朗玛峰,DVD 类别:纪录片,DVD 运行 时间:78 分钟,DVD 年份:50,DVD 价格:48.0

是什么导致数据存储不正确?

ArrayList<DVD> DVDArrayList = new ArrayList<DVD>();

     try 
     {
        BufferedReader kbd = new BufferedReader(new FileReader("DVDCollection.txt")); // Open the DVDCollection file.
        String line;
        while ((line = kbd.readLine()) != null) // Read the contents.
        {
            String dvdTitle = kbd.readLine();
            String dvdCategory = kbd.readLine();
            String dvdRunningTime = kbd.readLine();
            int dvdYear = kbd.read();
            double dvdPrice = (double) kbd.read();

            DVDArrayList.add(new DVD (dvdTitle, dvdCategory, dvdRunningTime, dvdYear, dvdPrice));
        }
        kbd.close(); // Close file after reading
     }
     catch (Exception e) 
     {
        System.out.println("Error reading file.");
    }

这是数据文件

Mystic River
Drama
130 minutes
2002
24.99
Everest
Documentary
78 minutes
2012
7.99
Life is Beautiful
Drama
125 minutes
1999
15.99
Village in China
Documentary
60 minutes
2006
11.99
Marley and Me
Comic
150 minutes
2008
17.99
Halloween Night
Mystery
80 minutes
2010
9.99

3 个问题:

  1. 您正在读取 line 变量但未使用它,因此 dvdTitle 数据丢失
  2. read() 年份将读取单个字符
  3. read() 价格将读作单个字符

逻辑:

String line;
while ((line = kbd.readLine()) != null) {
    String dvdTitle = line;
    String dvdCategory = kbd.readLine();
    String dvdRunningTime = kbd.readLine();
    int dvdYear = Integer.parseInt(kbd.readLine());
    double dvdPrice = Double.parseDouble(kbd.readLine());

    DVDArrayList.add(new DVD(dvdTitle, dvdCategory, dvdRunningTime, dvdYear, dvdPrice));
}
DVDArrayList.stream().forEach(System.out::println);