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

在Java中,使用扫描器从.txt文件中读取数据,这样我就可以用这些数据作为构造函数参数生成对象,java,string,Java,String,我有一个包含以下格式内容的.txt文件: Car 300 1 基本上,第一行是费用对象的名称,第二行是费用对象的成本,第三行是费用对象的频率。我的文本文件是按照该格式的三行的重复。我可以使用扫描仪将所有这些行存储到列表中,但由于某些原因,我的代码无法正确生成费用对象。创建费用对象时,我的构造函数将字符串expenseName、int expenseCost和int expenseFreq作为参数。然而,在调试之后,我注意到我的输出很奇怪,因为扫描器似乎正在读取.txt文件中的所有内容,就像它是

我有一个包含以下格式内容的.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而不是扫描仪,但就我所知,这应该是可行的。在扫描文件和将行添加到列表时,我尝试保留一个计数器。每当计数器为零时,我就使用Scanner的nextLine方法。每当计数器不为零时,我就会使用Scanner的nextInt方法,如果计数器等于2,我就会将计数器重置为零。这也不起作用-扫描器似乎仍然看到文件的内容都是字符串。为什么会这样


这段代码的目标是制作一个简单的费用跟踪应用程序。我想将我的费用添加到一个.txt文件中,并让代码读取该文件。以前,我在一个控制台应用程序中使用该代码,但每次我使用该应用程序时,都会在我的费用中输入冗长的代码。现在我想添加.txt读取功能,并最终添加一个GUI。谢谢您的建议。

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

我仍然是一名学生,但我认为你必须改变你看待问题的方式……试着将第一行分配给你类的字符串成员,第二行分配给int,第三行分配给int。为此,你可以使用从1到3的for循环和三个if语句


希望我帮了你

扫描仪出现问题的原因是
下一行()
返回字符串

试试这个:

public class readInFile {

    public static void main(String[] args){

       ArrayList list = new ArrayList();                

        File file = new File("C:/Practice/expenses.txt");
        ArrayList<String> fileContents = new ArrayList();

        try {
            Scanner input = new Scanner(file);

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


          for (int i=0; i< fileContents.size()-3; i++){

      String expenseName = fileContents.get(0);
      int expenseCost = Integer.parseInt(fileContents.get(1)) ;
      int expenseFreq = Integer.parseInt(fileContents.get(2));

      Expense e = new Expense(expenseName, expenseCost,expenseFreq);                             
       list.add(e);

            }
        }
公共类readinfle{
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();
File File=新文件(“C:/Practice/expenses.txt”);
ArrayList fileContents=新的ArrayList();
试一试{
扫描仪输入=新扫描仪(文件);
while(input.hasNext()){
add(input.nextLine());
}
对于(int i=0;i
阅读Scanner的javadoc中的方法“nextLine()”,然后你就会知道为什么它会像stringsas@Tom所说的那样读取它们,去看看