正常处理多个文件输入机制

时间:2010-08-04 17:58:53

标签: java api architecture

我目前正在重构一个库,供Java内部使用。

库接收XML文档,并返回Result数据结构。 鉴于:

  • 此库有两个客户端,一个将XML文档作为InputStream,另一个将文件路径作为String。
  • 客户端使用的类在实际处理之前在库内传递

处理文件的最佳架构是什么?

目前,它按以下方式处理(省略了无关的详细信息,更改了类的名称):

public class ILuvUsers {

public Result getResult(String path) {
    return getResult(ElementsLoader.loadIntermediateType(path));
}

public Result getResult(InputStream stream) {
    return getResult(ElementsLoader.loadIntermediateType(stream));
}

private Result getResult(IntermediateType itype) {
    //... do stuff and return Result
}
}

public class ElementsLoader {
public static IntermediateType loadIntermediateType(final InputStream is) {
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
    return doSomethingWithDocument(doc);
}

public static IntermediateType loadIntermediateType(final String path) {
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(path);
    return doSomethingWithDocument(doc);
}
}

我需要在InputStream和String的每个类中创建重载的方式对我来说似乎是一个代码味道。 如果第二天我需要支持使用'文件'类型怎么办? 最好我想以某种方式自动支持DocumentBuilder的解析方法的每个重载。

由于这在Java中实际上是不可能的,而且这似乎是一个常见的案例,这个问题的最佳实践是什么?你有没有看到任何好的解决方案?

1 个答案:

答案 0 :(得分:2)

这真的不是那么糟糕。域名有限,不会快速增长。

但是,您发现了一个需要为输入找到“最低公分母”的问题。

这通常是某种InputStream

如果有String,您想要打开Stream并使用Stream Loader。

鉴于Stream,你是金色的。

如果有File,您需要打开Stream并使用Stream Loader。

这应该涵盖所有可能的基础,因为AFAIK你可以用几乎任何东西制作一个InputStream。