2015-05-22 58 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对象,你可以把它添加到根据您的要求,任何集合。