2016-05-19 2 views
2

Я написал программу для проверки всех xmls, присутствующих в папке, и сообщите об ошибках. Я использовал утилиту Java Validator в моей программе.Проверка 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)); 
    ... 
} 

Тогда я функция, которая Подтверждает

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

Вышеупомянутые функции XML, возвращает слишком много открывать ошибки файлов, если он превышает системный предел максимального количества установленных файлов.

Если я изменяю параметр linux с помощью ulimit -n 3000, тогда он работает нормально. Я хочу знать, можем ли мы использовать другой способ проверки XML в самом Java-коде, так что мне не нужно менять системный параметр.

+0

Как насчет того, чтобы не открывать 3000 файлов одновременно? – Nadir

+2

Вам нужно закрыть StreamSource, когда закончите с ним. – Rob

+0

Я бы сказал, если вам нужно закрыть InputStream самостоятельно, то это ошибка. Саксон применяет правило, согласно которому тот, кто создает InputStream, отвечает за его закрытие. Когда вы используете 'new StreamSource (File)', система создает поток, поэтому система должна закрыть его. Однако документация JAXP не является явной. –

ответ

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

    } 
} 
+0

@OldCurmudgeon: Да, вы правы, я немного закрепил эту часть. – Berger

2

@Berger правильно в своем ответе, однако, если вы используете Java 7 или выше, вы можете использовать функциональные возможности примерки с-ресурса значительно сократить на шаблонный exception- и ресурсов обработки кода:

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

Смежные вопросы