当前位置: 首页 > 知识库问答 >
问题:

Java-发布从文本文件读取数据并将数据保存到对象的ArrayList[重复]

宁锐
2023-03-14

我正在寻找有关我的代码的帮助。我希望程序从读取。txt文件,创建一个动物对象,并根据文件中找到的数据将其插入动物对象的ArrayList中,前提是文件中的数据格式正确。

我创建了一个计数器来跟踪行号。因为我知道数据是如何在。txt文件已格式化,我可以预测一个动物对象的开始位置和另一个对象的结束位置。

我经常遇到的问题是ArrayList中的动物对象与文本文件中的最后一个动物具有相同的字段。非常感谢您的任何帮助。

BufferedReader userInputFile = null;
int ctr = 1;
try {
    userInputFile = new BufferedReader(new FileReader(userDocFilePath));
    Animal newFileAnimal = new Animal();

    while((s = userInputFile.readLine()) != null) {                                                
        if (ctr == 1){
            newFileAnimal.setName(s);
            ctr++;
        } else if (ctr == 2) {
            newFileAnimal.setSpineStatus(s);
            ctr++;
        } else if (ctr == 3) {
            newFileAnimal.setFurStatus(s);
            ctr++;
        } else if (ctr == 4) {
            newFileAnimal.setSwimStatus(s);
            System.out.printf("Animal name: %s\n\tSpine status: %s\n\t"
                + "Fur status: %s\n\tSwim status: %s\n", Animal.getName(), 
                + newFileAnimal.getSpineStatus(), 
                + newFileAnimal.getFurStatus(),
                + newFileAnimal.getSwimStatus());
            array.add(newFileAnimal);
            ctr = 1;
        }
    }

文本文件如下所示:

Rabbit
true
true
true
Duck
true
false
true

共有2个答案

唐海阳
2023-03-14

如果我正确理解了您的问题。您在ArrayList中得到以下结果:

Duck
true
false
true
Duck
true
false
true

如果是这种情况,则需要在while循环中移动动物对象初始化。

userInputFile = new BufferedReader(new FileReader(userDocFilePath));
Animal newFileAnimal = null;

while((s = userInputFile.readLine()) != null) {    
    newFileAnimal = new Animal();                                            
    if (ctr == 1){
        newFileAnimal.setName(s);
        ctr++;
    } else if (ctr == 2) {
        newFileAnimal.setSpineStatus(s);
        ctr++;
    } else if (ctr == 3) {
        newFileAnimal.setFurStatus(s);
        ctr++;
    } else if (ctr == 4) {
        newFileAnimal.setSwimStatus(s);
        System.out.printf("Animal name: %s\n\tSpine status: %s\n\t"
            + "Fur status: %s\n\tSwim status: %s\n", Animal.getName(), 
            + newFileAnimal.getSpineStatus(), 
            + newFileAnimal.getFurStatus(),
            + newFileAnimal.getSwimStatus());
        array.add(newFileAnimal);
        ctr = 1;
    }
}

编辑:

创建新对象的原因是,ArrayList不是创建新对象并存储,而是存储对象的引用,因此每次覆盖对象时,所有引用都指向更新的动物对象。

这个可能会有帮助

芮化
2023-03-14

那是因为您一遍又一遍地重复使用同一个动物对象。当读取下一个动物时,它的值会被覆盖。最后,您会得到最后一个动物的值。

该列表包含对同一个动物对象的n个引用。

要解决此问题,请为每种动物创建一个新对象。

 类似资料:
  • 问题内容: 是否可以将JSON数据保存到本地文本文件中?因此,稍后我可以通过加载该文件再次使用它,并取回存储的JSON数据。其实我真正想做的是在文本文件中导出JSON数据,以便以后可以用作import.Any的建议或解决方案? 这是我要用于导出到文本的一些示例。 http://jsfiddle.net/k56eezxp/ 问题答案: 是否可以将JSON数据保存到本地文本文件中? 是。当前,链接的j

  • 问题内容: 我看到过很多不同的文章,涉及到您应该以何种方式将对象序列化到文件,并且所有这些在本质上在执行方式和最佳实践方面存在冲突。因此,这就是我要保存的内容: 我们可以假设configArgs的大小已知,我需要制作一个文件,这就是到目前为止的内容。 问题答案: 好吧,我想,您想将对象直接写入文件 我只是提供了重要的代码。通过异常处理来实现。

  • 问题内容: 我需要一些帮助:我正在用Java进行超市仿真,但是有一个问题,我有一个文本文件(Stock.txt),例如,我在上面有所有的超市库存: 0-面包巧克力蛋糕-$ 12.5-250 1-Meat-Premium Steak- $ 2.6-120 2海鲜金枪鱼-1.2-14美元 … 第一个数字是产品的“ id”,第二个是产品所属的部门,第三个是产品名称,第二个是价格,最后一个数字是库存的产品

  • 我正在编写一个文件编写器,它将ID和名称(这两个字符串)写入文本文件。这需要用户输入,然后将数据存储在txt文件中。但是,当我再次运行它时,任何新数据都会覆盖以前的数据,因此数据永远不会保存到txt文件中。 谁能告诉我如何保存这些数据,以便添加的任何新数据都存储在下一行,而不覆盖上一行? 谢啦

  • 本文向大家介绍C#从数据库读取数据到DataSet并保存到xml文件的方法,包括了C#从数据库读取数据到DataSet并保存到xml文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#从数据库读取数据到DataSet并保存到xml文件的方法。分享给大家供大家参考。具体实现方法如下: DataSet有一个WriteXml方法可以直接将数据保存到xml文件 希望本文所述对大家的C#程

  • 问题内容: 我有这个项目: 导入文件 连接到SQL Server数据库 将所有数据转移到数据库中 文本文件按选项卡划分为四个字段,例如数据库。 我已经完成了使用富文本框并将所有数据保存在字符串中的第一步。我的想法是将字符串拆分为每行并将其保存在数组中,然后:如何拆分每一行,以便可以正确保存字段?如何将SQL Server上的数据库连接到C#上的项目? 问题答案: 让我们一次解决这一步骤… 获取数据