Java XML验证。打开的文件太多

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 <

我编写了一个程序来验证文件夹中存在的所有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 < 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
    }
}