2015-05-22 60 views
1

A dat文件包含以下格式的信息,其格式爲writeUTFFruit, Colour, Taste, Yes/No,最後一個是Yes或No,但是它是一個字符串。現在基於主數據的實例創建

,一類定義如下

public class Food { 
    private String name; 
    private String colour; 
    private String taste; 
    private boolean availability; 


    public Food(String name, String colour, String taste, boolean availability) { 
     this.name = name; 
     this.colour = colour; 
     this.taste = taste; 
     this.availability = availability; 
    } 


} 

當我看到dat文件有:

FileInputStream fis = new FileInputStream("food.dat"); 
DataInputStream dis = new DataInputStream(fis); 

我可以以某種方式轉換的文本行立即進入Food一個實例?棘手的是String -> boolean

起初,我想該文件的每一行添加到ArrayList,然後從,分割每行並將其加入到龐大的一個字符串,並使用if邏輯來處理Yes/No一部分,但如果也有數千行此信息?這種方法不會吸引太多。

條件是這不使用ObjectOutputStream,可悲的是書面(某種類型的任務,我沒有創建的規則)。有沒有辦法從文件中讀取一行並根據這些信息創建一個實例?

回答

2

爲什麼要添加一切都變成清單?通過readUTF讀取每行,在逗號分隔,然後有一個方法從4個組件生成一個Food對象。然後將你的食物對象添加到你想要的任何容器中。

public Food (String[] data){ 
    if (data==null || data.length!=4){ 
    // error handling 
    } 
    this.name=data[0]; 
    ... 
    this.availability="Yes".equals(data[3]) 
} 
+0

可獲得性參數是一個布爾值。這不會產生問題嗎? –

+0

你創建了第二個構造函數:你有一個有4個參數的構造函數,你保存它,然後添加一個我給你創建的文本行。 –

+0

我明白了,但是如果我使用原始構造函數創建了一個實例,然後又想將它''DataOutputStream''放入已存在的文件中,該怎麼辦?然後,我是否定義了一種方法,在寫入之前將布爾值更改爲文本? –

1

是的,你可以這樣做。爲此,您需要知道數據的格式並相應地編寫解析器。 1)如果輸入行(或)數據與, | :分隔,則拆分數據併爲每行創建對象Food。使用setters方法設置對象中的數據。

String[] splitData = input.split("delimiter"); 
//length and error check of SplitData 
Food food = new Food(); 
food.setName(splitData[0])); 
... 

(或)

傳遞輸入線經由構造食物對象,並讓構造做分割和數據分配。

Food(String input){ 
      String[] splitData = input.split("delimiter"); 
      //length and error check of SplitData 
      name = splitData[0]; 
      ... 
    } 

一旦創建了Food對象,你可以把它添加到根據您的要求,任何集合。