从文本文件中读取数据并将其存储在对象中

问题描述:

我在每一行上都有一个数字的文本文件。从文本文件中读取数据并将其存储在对象中

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) 

如何三块的信息存储到各自的对象?

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

+1

这意味着您已到达文件末尾。为什么你对同一个文件有两个'Reader'实例?只需使用['Files.readAllLines'](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#readAllLines(java.nio.file.Path,%20java .nio.charset.Charset))。 – 2014-10-31 08:24:49

+0

尝试在执行整数转换之前打印当前行的日志,以便在发生故障时确切地知道哪一行。除此之外,和鲍里斯一样的评论:为什么你不保留lineNumber作为你的读者? – gdupont 2014-10-31 08:26:45

+0

我以为BufferedReader和LineNumberReader是不同的。如果我只留下'LineNumberReader'并用'lineNumber'替换'inputFile',我会在'String line = inputFile.readLine();'处得到一个错误。''它说:java.io.IOException:Steam close(在java.io. BufferedReader' – user3479783 2014-10-31 08:33:51

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

此外,您的循环应该因为您已将行数除以3,所以您不会将i增加为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 } 
+0

或者只是使用'Files.readAllLines'并且省去90%的复杂度。 – 2014-10-31 09:42:26

与代码的问题是与下面的嵌套循环:

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。另外,因为你永远不会重新指定变量,它将永远不为空(除非你读取一个空文件)并且会创建无限循环。

由于您已经拥有基于文件中行数的条件,因此将外部变量全部删除并解决问题。

你为什么不创建一个名为汽车类:

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