如何识别给定文件或String是否为Java Properties文件格式?

时间:2012-12-06 13:27:47

标签: java parsing properties

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

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

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

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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

答案 2 :(得分:0)

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