如何从文件输入中读取识别类和字段?

时间:2016-03-12 21:54:35

标签: java arrays oop bufferedreader filereader

我有一个如下文件:

7
CAT   Tabby   Jane   F   2   7.0   true   false
DOG   Sam    Jeff   M   7   32.1   true
CAT  Elsie   Kate   F   9   9.8   true   true
DOG  Spot    Dick   M   6   63.4   false
BIRD  Tweety  Dick   M   3   0.06   false
BIRD  Opus   Berkeley   M   31   10.3   true
DOG  Spot    John   M   3   42.6   true

我文件的第一列代表类,下面的列代表各个类的变量/字段值。我想以某种方式读取行,以便我的读者识别第一列是类,第二列是名称变量,第三列所有者变量第四是名称(宠物)的性别等等。 以下是变量(以防万一你需要强烈的想法):

    protected String name;
    protected String owner;
    protected String sex = "F";
    protected int age = 3;
    protected double weight = 5.0;
    protected boolean spayedNeutered;  
    private boolean declawed;(which is a subclass filed)

因此,当我按以下方式阅读文件输入时:

public void readData()  throws Exception{
    BufferedReader filename = new BufferedReader(new   FileReader("pets.txt"));
    String str;

    List<String> list = new ArrayList<String>();
   while((str = filename.readLine()) != null){
            String[] temp = str.split("\\s+",2);
            list.add(temp[1]);
        }

    pets = list.toArray(new String[6]);

    for (String x: pets) {
        System.out.println(x);
    }

    }

这只是打印来自file的普通数据。我不知道如何告诉读者识别每个特定列代表类和各自(按顺序)变量值。在我识别字段和类之后,我将它们放在像Pet []宠物一样的数组中(Pet是我的父类/超类)。然后我将应用自定义的toString方法以某种方式打印对象数组,如下所示:

> java AnimalHospital pets.data
Tabby owned by Jane: Small Cat, F, Age 2, 7.0 lbs. (not declawed)
Sam owned by Jeff: Medium Dog, M, Age 7, 32.1 lbs.
Elsie owned by Kate: Medium Cat, F, Age 9, 9.8 lbs.
Spot owned by Dick: Large Dog, M, Age 6, 63.4 lbs. (not spayed/neutered)
Tweety owned by Dick: Small Bird, M, Age 3, 0.06 lbs. (not clipped)
Opus owned by Berkeley: Large Bird, M, Age 31, 10.3 lbs.
Spot owned by John: Medium Dog, M, Age 3, 42.6 lbs.

我希望我的问题有足够的信息来澄清我的核心问题。

3 个答案:

答案 0 :(得分:0)

我从你的问题中理解,你必须基本上做一个类名和值的映射。您可以使用Map来实现此目的。

既然你知道第一列是宠物类,第二列是名字,第三列是性别等,所以在&#34;之后分割整行。 &#34;,你可以使用Map m:

m.put("class",temp[0]);
m.put("name",temp[1]);

依旧......

返回类型为Map。

希望这有帮助。

答案 1 :(得分:0)

如果你想避免反思,并假设你事先知道所有的类并使用java8,你可以写一个这样的开关语句:

Animal animal;
switch (tmp[0]) {
    case "CAT":
        animal = new Cat();
        break;
    case "DOG":
        animal = new Dog();
        break;
// etc etc
    default:
        throw new RuntimeException("Unknown animal:" + tmp[0]);
}

答案 2 :(得分:0)

你不能使用BufferedReader.BufferedReader没有那个功能。你必须解析它。