用Java读取文件的动态方式

时间:2017-11-16 23:14:08

标签: java

我在阅读文件方法时有以下代码:

FileReader fileReader = new FileReader(fName);
bf = new BufferedReader(fileReader);
while ((line = bf.readLine()) != null) {
    if (line.contains("Worker")) {
        info  = line.split(" ");
        int x = Integer.parseInt(info[1]);
        int y = Integer.parseInt(info[2]);
        worker = new Worker(new Point(x, y);
        globalList.add(worker);
    }
    if (line.contains("Work")) {
        info  = line.split(" ");
        int x = Integer.parseInt(info[1]);
        int y = Integer.parseInt(info[2]);
        work = new Work(new Point(x, y);
        globalList.add(work);                   
    }
    if (line.contains("Bulldozer")) {
        info  = line.split(" ");
        int x = Integer.parseInt(info[1]);
        int y = Integer.parseInt(info[2]);
        bulldozer = new Bulldozer(new Point(x, y);
        globalList.add(bulldozer);                  
    }
}

通过这段代码,我可以从一个看起来像这样的文件中读取:

Worker 5 0
Bulldozer 7 5
Work 4 2
Work 4 8

我正在使用BufferedReader执行此操作,我在此案例类WorkerBulldozerWork中创建类的实例,读取文件中的单词(这是类的名称)并获取x和y位置,并将该对象添加到列表中。

这很完美,我的问题是这看起来很难编码而且这不是一个好主意,因为这是一个学校项目,所以你们有任何提示可以帮助我使这个代码多一点动态,也许只是在if语句?

1 个答案:

答案 0 :(得分:1)

基本上,if的所有三个分支都做同样的事情 - 它们读取两个整数,准备一个点,然后将它注入一个对象。

唯一不同的是第一个字符串和类名。使用反射,你可以使它成为通用的 - 在包中搜索名为string的类,创建Point,然后调用类的单参数构造函数。

如果没有反射,您仍然可以通过一个方法来提取它,该方法将StringFunction<Point, Object>作为工厂参数。

该方法可以做到这一点:

public void readIfMatches(String line, String match, Function<Point, Object> factory) {
    if (line.contains(match)) {
        String info  = line.split(" ");
        int x = Integer.parseInt(info[1]);
        int y = Integer.parseInt(info[2]);
        globalList.add(factory.apply(new Point(x, y));
    }
}

然后你调用这样的三个迭代:

readIfMatches(line, "Bulldozer", Bulldozer::new)