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

在Java中,使用扫描器从.txt文件中读取数据,这样我就可以用该数据作为构造函数参数生成对象

陆曜文
2023-03-14

我有一个.txt文件,其内容具有以下格式:

Car
300
1

基本上,第一行是费用对象的名称,第二行是费用对象的成本,第三行是费用对象的频率。我的文本文件是按照这种格式重复的三行。我可以使用扫描器将所有这些行存储到一个列表中,但由于某种原因,我的代码没有正确生成费用对象。创建支出对象时,我的构造函数将字符串expenseName、int expenseCost和int expenseFreq作为参数。但是,在调试之后,我注意到我的输出很奇怪,因为它显示扫描器从.txt文件中读取所有内容,就好像它是一个字符串一样,即使我想将它存储为一个整数。代码如下:

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;

    public class readInFile {

        static ArrayList list = new ArrayList();
        static String expenseName;
        static int expenseCost;
        static int expenseFreq;

        public static void main(String[] args){
            File file = new File("C:/Practice/expenses.txt");
            ArrayList fileContents = new ArrayList();
            int count = 0;
            int makeExpenseObject = 0;

            try {
                Scanner input = new Scanner(file);

                while(input.hasNext()){
                    fileContents.add(input.nextLine());
                }

                for (Object o: fileContents){
                    if (makeExpenseObject == 3){
                        Expense e = new Expense(expenseName, expenseCost, expenseFreq);
                        makeExpenseObject = 0;
                        list.add(e);
                    }

                    if (o instanceof String){
                        expenseName = o.toString();
                        makeExpenseObject++;
                    }

                    else if (o instanceof Integer && count == 0){
                        expenseCost = (int)o;
                        count++;
                        makeExpenseObject++;
                    }
                    else if (o instanceof Integer && count != 0){
                        expenseFreq = (int)o;
                        count = 0;
                        makeExpenseObject++;
                    }
                }
            }
            catch (FileNotFoundException e) {
                System.out.println("File not found.");
            }

            for (Object o: list){
                Expense e = (Expense) o;
                System.out.println(e.getName() + ", " + e.getCost() + ", " + e.getFreq());
            }

        }
    }

我想尝试一个BufferedReader而不是一个扫描仪,但这应该是工作的,就我所知。我试着在扫描文件并将行添加到列表时保留一个计数器。每当计数器为零时,我就会使用扫描器的nextLine方法。每当计数器不是零时,我就会使用扫描器的nextInt方法,如果计数器等于2,我就会将它重置为零。这也不起作用--似乎扫描器仍然看到文件的内容都是字符串。这是为什么?

这段代码的目标是为了好玩而制作一个简单的费用跟踪应用程序。我想把我的开销添加到一个.txt文件中,并让代码读取该文件。以前,我在一个控制台应用程序中使用这些代码,但每次使用该应用程序时,都要花费大量的时间输入这些代码。现在,我想添加.txt读取功能,并最终添加一个GUI。谢谢你的建议。

共有1个答案

农飞尘
2023-03-14

当您从文件中读取数据时,为什么不直接将其分配给正确的变量呢?然后使用Integer.ParseInt(String s)方法解析变量。

 类似资料:
  • 问题内容: 我要分割以下数据。 获取每个值: 1 167 2 ‘LT2A’ 45 ‘每周’ ‘1,2,3,4,5,6,7,8,9,10,11,12,13’ 我使用的扫描仪类来做到这一点,用 , 作为分隔符。但由于最后一个字符串,我遇到了问题。 因此,我想就如何拆分这些数据提出一些建议。 我也尝试过使用’作为分隔符,但字符串包含不带’的数据。 这个问题是非常适合我的需求的,但是如果有人可以给我一些建

  • 我想对签名为的方法进行单元测试 连接对象使用 并在测试时传递给methodA。 神谕sql。数组有一个构造函数 methodA具有获取ArrayDescriptor的逻辑。它还具有为该构造函数提供第三个参数的逻辑,但它将其作为对象数组提供 我模拟这两组逻辑,并传递一个模拟的ArrayDescriptor对象和一个模拟的对象数组。所有这些模仿都是正确的。 所以我的构造函数调用就像 当作为测试的一部分

  • 我已经尝试了三天的工作来解决这些问题,但它并不像我预期的那样起作用。下面是描述和代码: 描述: 人员类 学生类从Person继承:最重要的是属性favSubject的数据类型是ArrayList 教师类从Person继承 PrintInfo类包含:构造函数、print方法和从文件读取方法 Person类: 学生班级: 教师班级: PrintInfo类 测试类: 我想用getInfoFromFile

  • 我需要一些帮助:我正在做一个在Java的飞行花名册模拟。名册将容纳25名乘客,其中22名来自文本文件(passengerlist.txt)。对于每个乘客,有3个必需的数据点;姓名、座位等级和座位号和2个可选数据点数常旅客号码和常旅客点数。每个乘客都在自己的线路上,每个数据点都用逗号隔开。例如: 我有这个类,到目前为止还有构造函数: 我需要做的是从文本文件中读取每一行并创建数组,即使第一个look行

  • 我正试图用BlueJ完成一项为uni完成的任务,但我在第一个障碍上遇到了障碍。 在赋值中,我们得到了一个类,以及该类的构造函数、方法和参数的名称。我们不允许更改这些,因为赋值部分地由测试单元标记(或类似的东西)。 该类的一个构造函数如下所示 我已经(部分)完成了 我不明白的是为什么-为什么他们使用作为构造函数的参数?这样做有什么好处? (我想这样做肯定有好处(如果没有,功能就不会存在),但我不明白

  • 对于我的Java应用程序,我尝试使用ScalaCheck编写一些基于属性的单元测试。为此,我需要生成器,但我能找到的所有教程都使用带有参数的构造函数来生成对象。我需要生成的对象没有构造函数参数,我无法添加这样的构造函数,因为它来自外部库。 我现在有以下内容(Jwt声明来自软件包组织.jose4j.jwt): 关于如何编写我的生成器,有什么建议吗?我对Scala一无所知,所以如果我犯了一个“明显”的