如何识别给定内容(文件,String
或InputStream
)是否为 Java属性文件格式?
内容存储在数据库中,如果是属性文件,则应解析为Properties
。但是,通过一个简单的测试,我注意到,java.util.Properties
无错误地解析了 xml 文件</log4j
)。它可以“解析”一个普通的文本文件。
所以,如果java.util.Properties
几乎可以解析文本的所有内容,我怎么能识别出我是否有属性文件?我需要检查这是否是其他任何公认的格式,我可以使用一些启发式方法,还是现有的具有此类功能的库?
答案 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()方法作为您的测试),那么您可以假设它是一个有效的属性文件。