Java XML验证。打开的文件太多
我编写了一个程序来验证文件夹中存在的所有XML,并报告失败的XML。我在程序中使用了java XML validator实用程序Java XML验证。打开的文件太多,java,xml,file,exception,Java,Xml,File,Exception,我编写了一个程序来验证文件夹中存在的所有XML,并报告失败的XML。我在程序中使用了java XML validator实用程序 SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = factory.newSchema(new File("xsdPath")); 我有一个在循环中验证的xml文件列表 for (int i = 0; i <
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new File("xsdPath"));
我有一个在循环中验证的xml文件列表
for (int i = 0; i < list.size(); i++) {
String returnValue = validateXML(list.get(i));
...
}
如果超过系统设置的最大文件数限制,上述函数将返回“打开的文件过多”错误
如果我使用ulimit-n3000更改linux参数,那么它就可以正常工作。我想知道我们是否可以使用另一种方法来验证java代码本身中的XML,这样我就不需要更改系统参数。您可能需要跟踪底层InputStream,以便在完成后关闭它:
public static String validateXML(String xmlPath){
BufferedInputStream xmlStream = null;
try {
validator = schema.newValidator();
xmlStream=new BufferedInputStream(new FileInputStream(xmlPath));
Source src=new StreamSource(xmlStream);
validator.validate(src);
} catch (IOException e) {
// do something
}
finally{
if(xmlStream != null){
try{
xmlStream.close();
}
catch(Exception e){
// error while closing
}
}
}
}
@Berger的回答是正确的,但是如果您使用的是Java 7或更高版本,则可以使用资源试用功能来显著减少样板文件异常和资源处理代码:
public static String validateXML(String xmlPath){
validator = schema.newValidator();
try (BufferedInputStream xmlStream = new BufferedInputStream(new FileInputStream(xmlPath))) {
validator.validate(new StreamSource(xmlStream));
} catch (IOException e) {
// do something
}
}
详情如下:
不一次打开3000个文件怎么样?处理完StreamSource后,你需要关闭它。我会说,如果你需要自己关闭InputStream,那就是一个bug。Saxon应用了一条规则,即创建InputStream的人负责关闭它。使用新的StreamSourceFile时,系统正在创建流,因此系统应将其关闭。但是JAXP文档在这一点上并不明确。@OldCurmudgeon:是的,你是对的,我对这部分做了一些保护。
public static String validateXML(String xmlPath){
validator = schema.newValidator();
try (BufferedInputStream xmlStream = new BufferedInputStream(new FileInputStream(xmlPath))) {
validator.validate(new StreamSource(xmlStream));
} catch (IOException e) {
// do something
}
}