1

如何识别给定内容(文件StringInputStream)是否为Java 属性文件格式?

Properties 内容存储在数据库中,如果是属性文件,则应解析为。但是,通过我注意到的一个简单测试,它可以java.util.Properties正确解析xml文件</log4j)。它也可以“解析”一个普通的文本文件。

所以,如果它java.util.Properties几乎可以解析所有什么是文本,我如何识别我是否有属性文件?我需要检查这是否是任何其他可识别的格式,我可以使用一些启发式方法还是存在具有此类功能的现有库?

4

3 回答 3

2

我会将流(文件或字符串)读入 BufferedReader。然后,我会检查 xml 文件形式的属性:

取自 javadoc:

The XML document must have the following DOCTYPE declaration:
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

因此,您可以检查 DOCTYPE(使用阅读器并通过第一行或 - 通过使用 xml 解析器进行解析,例如 jdom)。如果 DOCTYPE 存在,请使用:

Properties.loadFromXML()

否则,您可以查找与模式匹配的行 \s*\w+\s*=.* 这样您就会知道在那里进行了一些分配,因此它可以是您加载的属性文件:

Properties.load()
于 2012-12-06T13:48:36.543 回答
2

我会这样做

private boolean isProperties(Scanner sc) {
    Pattern p = Pattern.compile("\\w.*[=:] *.+");
    int nProps = 0;
    while (sc.hasNextLine()) {
        String line = sc.nextLine();
        if (!line.startsWith("#")) {
            if (!p.matcher(line).matches()) {
                sc.close();
                return false;
            }
            nProps++;
        }
    }
    sc.close();
    return nProps > 0;
}

public boolean isProperties(String s) {
    return isProperties(new Scanner(s));
}

public boolean isProperties(File f) throws FileNotFoundException {
    return isProperties(new Scanner(f));
}

     ... more overloaded isProperties for different sources

这只是一个原型,正则表达式可能需要改进,请参阅 Properties.load API。我会忽略 xml 版本,但如果需要,它会更简单,因为 API 中有 DTD

于 2012-12-06T14:10:53.293 回答
0

您可以将 propertyNames() 方法发送到生成的属性对象,如果您返回一个或多个名称(您返回一个 Enumeration - 使用 hasMoreElements() 方法作为您的测试),那么您可以假设它是一个有效的属性文件。

于 2012-12-06T13:32:29.140 回答