Поток закрыл исключение в Java - PullRequest
1 голос
/ 10 февраля 2011

Пожалуйста, посмотрите на то, что я сделал

private InputSource getContent(String fName) throws SAXException, IOException, ServiceException {
        // Some code here
        if(currentNodeRef != null)
        {
            ContentReader reader = contentService.getReader(currentNodeRef,ContentModel.PROP_CONTENT);

            InputStream inputStream = null;
             try 
             {  
                    inputStream = new BufferedInputStream(reader.getContentInputStream(),16384);

                    return new InputSource(inputStream);
             }
             finally
             {
                 if(inputStream!=null)
                    try 
                    {
                        inputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
             }
        }
        return new InputSource();
}

В моем методе parseDocument я вызвал вышеуказанный метод.

parseDocRoot(getContent(fName),path);

В parseDocRoot

public  void parseDocRoot (InputSource ins, String path) throws SAXException, IOException,
  ParserConfigurationException, ServiceException
  {
          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
          DocumentBuilder builder = factory.newDocumentBuilder();
            builder.setEntityResolver(new EntityResolver() {
                public InputSource resolveEntity(String publicId, String systemId)
                        throws SAXException, IOException {
                     return new InputSource(new ByteArrayInputStream(new byte[0])); 
                }
            });
        Document doc = builder.parse(ins);
        NodeList list = doc.getChildNodes();
        parseDocument(list,path);
  }

Я получил ошибку, сказав, что поток не закрыт, и во время отладки вышеуказанного кода я обнаружил, что ошибка находится в строке

Document doc = builder.parse(ins);

Пожалуйста, помогите мне найти решение.

1 Ответ

5 голосов
/ 10 февраля 2011

Я считаю, что ошибка в том, что поток закрыт .Причина в том, что у вас есть блок finally:

         try 
         {  
                inputStream = new BufferedInputStream(reader.getContentInputStream(),16384);

                return new InputSource(inputStream);
         }
         finally
         {
             if(inputStream!=null)
                try 
                {
                    inputStream.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
         }

Вы закрываете поток в блоке finally.Этот код выполняется непосредственно перед возвратом из метода.Важно отметить, что InputStream не потребляется до тех пор, пока метод не вернется, и не будет обработан методом parse.

Вместо этого вы должны поместить блок finally вокруг всего блока кода -закрытие потока, когда вы на самом деле сделали.Самый простой способ сделать это - встроить ваш метод getContent и поставить блок finally после вызова parse.После того, как вы это сделаете, вы сможете найти способ инкапсулировать эту логику, но это будет довольно сложно, так как вам определенно нужно сохранять дескриптор InputStream до тех пор, пока вы не закончите анализ, чтобы вы могли закрыть его,

Другим гораздо более простым вариантом было бы заставить getContent возвращать Document вместо этого, просто перемещая parseDocRoot(getContent(fName),path); внутри этого метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...