2014-10-31 104 views
1

我在每一行上都有一個數字的文本文件。從文本文件中讀取數據並將其存儲在對象中

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

回答

2

這是因爲您正在閱讀文件的第一行,而沒有使用它;您將從文件的第二行開始,並將其分配給第一輛車的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

1

與代碼的問題是與下面的嵌套循環:

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。另外,因爲你永遠不會重新指定變量,它將永遠不爲空(除非你讀取一個空文件)並且會創建無限循環。

由於您已經擁有基於文件中行數的條件,因此將外部變量全部刪除並解決問題。

0

你爲什麼不創建一個名爲汽車類:

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(); 
相關問題