XML验证。打开的文件太多

时间:2016-05-19 12:57:16

标签: java xml file exception

我编写了一个程序来验证文件夹中存在的所有xml并报告失败的文件。我在程序中使用了java XML验证器实用程序。

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));
    ...
}

然后我有一个验证XML的功能

public static String validateXML(String xmlPath){
    try {
        validator = schema.newValidator();
        validator.validate(new StreamSource(new File(xmlPath)));
    } catch (IOException e) {
        ...
}

如果上述函数超出了设置的最大文件数的系统限制,则会返回太多打开的文件错误。

如果我使用ulimit -n 3000更改linux参数,那么它的工作正常。我想知道我们是否可以使用不同的方法来验证java代码本身的XML,这样我就不需要更改系统参数。

2 个答案:

答案 0 :(得分:2)

您可能希望跟踪基础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
            }            
        }

    }
}

答案 1 :(得分:2)

@Berger在他的回答中是正确的,但是如果您使用的是Java 7或更高版本,则可以使用try-with-resource功能来显着减少样板异常和资源处理代码:

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
    }
}

此处有更多详情:

The try-with-resources Statement