【问题标题】:How to read recognizing class and fields from file input?如何从文件输入中读取识别类和字段?
【发布时间】:2016-06-28 02:07:45
【问题描述】:

我有一个类似下面的文件:

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

    }

这只会打印来自文件的普通数据。我不知道如何告诉读者识别每个特定列代表类和相应的(按顺序)变量值。识别字段和类后,我将它们放在像 Pet [] pets 之类的数组中(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.

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

【问题讨论】:

  • 您需要使用类似Class.forName() 的构造。这种技术称为反射。
  • @Evangey 它说反射是一个强大的工具,建议只由了解基本功能的高级用户使用。你能推荐任何其他像我这样的初学者可以使用的技术吗?我真的很想学习,而不是仅仅使用一个高级的 API 类就可以了。
  • 重新反射——的确,反射是强大的,虽然使用强大的工具并没有错,如果不尝试就无法学习它们......

标签: java arrays oop bufferedreader filereader


【解决方案1】:

我从您的问题中了解到,您基本上必须对类名和值进行映射。您可以为此使用地图。

既然你知道第一列是宠物的类别,第二列是名字,第三列是性别等,所以在以“”为基础分割整行之后,你可以使用 Map m 这样:

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

等等……

返回类型为 Map。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    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]);
    }
    

    【讨论】:

      【解决方案3】:

      使用 BufferedReader 无法做到这一点。BufferedReader 没有该功能。您必须对其进行解析。

      【讨论】:

        猜你喜欢
        • 2022-07-15
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 2011-07-18
        • 1970-01-01
        • 2021-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多