从文件读取时,将不正确的数据存储在对象的数组列表中

时间:2018-03-08 07:55:30

标签: java file object arraylist bufferedreader

所以我是新手使用BufferedReader从文件中读取,以及在Java中使用arrayLists。我想知道为什么我的代码不会在arrayList中的每个DVD对象中存储正确的数据。我最初认为这种方法的工作原理是它从文本文件的顶部开始,读取该行,然后将该信息存储在变量中。在完成读取双精度值后,它会根据之前找到的信息创建一个DVD对象。然后文件将继续读取并存储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

1 个答案:

答案 0 :(得分:2)

3个问题:

  1. 您正在阅读line变量但由于dvdTitle数据丢失而未使用该变量
  2. read()年份会读取单个字符
  3. read()价格会读取单个字符
  4. 逻辑:

    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);