【问题标题】:Reading data from a text file and storing it in an object从文本文件中读取数据并将其存储在对象中
【发布时间】:2014-10-31 08:18:35
【问题描述】:

我有一个文本文件,每行都有一个数字。

0 
55
3
15
63
8
0
-8
9
89
504
32

我有一个Car,它接受三个参数:

  • 起始里程表读数
  • 最后的里程表读数

文本文件中的第一行对应于里程表的起始读数。
二是终读。
第三个是升。
第四个是第二个Car等的起始里程表读数。

我需要读取文本文件,创建一个对象,并将这个参数传递给汽车。

对于car3 (0, -8, 9),有一个负数,因此整个集合被忽略,(89, 504, 32) 变为car3

我已经提到Anubian Noob's answer;到目前为止,这是我的代码:

final String INPUT_FILE = "data.txt";
final String OUTPUT_FILE = "report.txt";

BufferedReader inputFile = new BufferedReader (new FileReader (INPUT_FILE)); 
BufferedWriter outputFile = new BufferedWriter (new FileWriter (OUTPUT_FILE));
LineNumberReader  lineNumber = new LineNumberReader (new FileReader (INPUT_FILE));
lineNumber.skip(Long.MAX_VALUE);
int length = lineNumber.getLineNumber();
lineNumber.close();


String line = inputFile.readLine();

Car[] car = new Car[length/3];

while (line != null)
{
    for (int i = 0; i < length/3; i += 3) 
    {
        int startReading = Integer.parseInt(inputFile.readLine());
        int endReading = Integer.parseInt(inputFile.readLine());
        int liter = Integer.parseInt(inputFile.readLine());
        car[i] = new Car (startKm, endKm, litre);
    }
}
inputFile.close();
outputFile.close();

在线int liter = Integer.parseInt(inputFile.readLine());我得到以下错误:

java.lang.NumberFormatException: null 
null (in java.lang.Integer)

如何将这三条信息存储到其各自的对象中?

*注意:文本文件中没有固定的行数,我们必须使用数组。

【问题讨论】:

  • 这意味着您已到达文件末尾。为什么同一个文件有两个 Reader 实例?只需使用Files.readAllLines
  • 在进行整数转换之前尝试打印当前行的日志,以便您确切知道失败时是哪一行。除此之外,和鲍里斯一样的评论:你为什么不只保留 lineNumber 作为你的读者?
  • 我认为 BufferedReader 和 LineNumberReader 是不同的。如果我只留下LineNumberReader 并将inputFile 替换为lineNumber,我会在String line = inputFile.readLine(); 得到一个错误它说java.io.IOException: Steam close (in java.io.BufferedReader

标签: java


【解决方案1】:

这是因为您正在读取文件的第一行,而不是使用它;您从文件的第二行开始,并将其分配给第一辆车的startReading。因此,文件中将没有足够的行数(您首先计算了文件中的行数,从而计算了汽车的数量,但是您读取的一行太多了)

此外,您的循环不应将 i 增加 3,因为您已经将行数除以 3。并且您正在使用 i 作为 car 数组的索引。

将代码改为:

lineNumber.close();

// REMOVE String line = inputFile.readLine();

Car[] car = new Car[length/3];

// REMOVE while (line != null)
// REMOVE {
for (int i = 0; i < length/3; i ++) // DON'T DO i += 3 because that will make you go beyond the bounds of the car array 
{
    int startReading = Integer.parseInt(inputFile.readLine());
    int endReading = Integer.parseInt(inputFile.readLine());
    int liter = Integer.parseInt(inputFile.readLine());
    car[i] = new Car (startKm, endKm, litre);
}
// REMOVE }

【讨论】:

  • 或者直接使用Files.readAllLines,如果复杂度可以省掉90%。
【解决方案2】:

代码的问题在于下面的嵌套循环:

String line = inputFile.readLine();
Car[] car = new Car[length/3];

while (line != null)
{
    for (int i = 0; i < length/3; i += 3) 
    {
        int startReading = Integer.parseInt(inputFile.readLine());
        int endReading = Integer.parseInt(inputFile.readLine());
        int liter = Integer.parseInt(inputFile.readLine());
        car[i] = new Car (startKm, endKm, litre);
    }
}

由于您正在读取inputFile 的第一行以初始化line 变量,因此您进一步读取的所有汽车值都减1。此外,由于您永远不会重新分配line 变量,因此它将始终不为空(除非你读取一个空文件)并且会创建无限循环。

将 line 变量与外部循环一起删除应该可以解决问题,因为您已经有了基于文件中行数的条件。

【讨论】:

    【解决方案3】:

    为什么不创建一个名为 car 的类:

    public Class Car{
      private int starting_odometer;
      private int final_odometer;
      private int liters;
      //Constructor
      //Getters and setters
    }
    

    然后读取文件并将行设置为正确的属性:

        Car myCar = new Car();
    BufferedReader br = new BufferedReader(new FileReader(file));
    String line;
    int count=1;
    while ((line = br.readLine()) != null) {
    if(count<=3)
    {    
        if(count==1){
        myCar.setStarting_odometer(parseInt(line);
        }
        if(count==2){
        myCar.setFinal_odometer(parseInt(line);
        }
        if(count==3){
        myCar.setLiters(parseInt(line);
        }
        count++;
    }
    else {count=1;}    
    
    }
    br.close();
    

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多