为什么我得到java.io.IOException:流是关闭的异常?

为什么我得到java.io.IOException:流是关闭的异常?,java,xml,inputstream,ioexception,Java,Xml,Inputstream,Ioexception,从java客户端,我试图从返回XML的python服务器获取数据。我的步骤是: 验证XML的Inputstream 将Inputstream转换为XML进行处理 我在客户机类中的验证代码如下 public static boolean isValidXML(InputStream xmlInputStream) { try { Source xmlFile = new StreamSource(xmlInputStream); URL schemaFile

从java客户端,我试图从返回XML的python服务器获取数据。我的步骤是:

  • 验证XML的Inputstream
  • 将Inputstream转换为XML进行处理
  • 我在客户机类中的验证代码如下

    public static boolean isValidXML(InputStream xmlInputStream) {
        try {
            Source xmlFile = new StreamSource(xmlInputStream);
            URL schemaFile = new URL("https://www.w3.org/2001/XMLSchema.xsd");
            SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = schemaFactory.newSchema(schemaFile);
            Validator validator = schema.newValidator();
    
            validator.setErrorHandler(new ErrorHandler() {
    
                    // all the overridden methods 
            });
    
            validator.validate(xmlFile);
    
        } catch (SAXException ex) {
            System.out.println(ex.getMessage());
            return false;
    
        } catch (IOException e) {
            System.out.println(e.getMessage());
            return false;
        }
        return true;
    }
    
    }

    InputStream的处理过程如下

    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    if (MyClient.isValidXML(con.getInputStream())) {
                BufferedReader inputReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                StringBuilder sb = new StringBuilder();
                String inline = "";
                while ((inline = inputReader.readLine()) != null) {
                    sb.append(inline);
                }
    
                SAXBuilder builder = new SAXBuilder();
    
                Document document = (Document) builder.build(new 
                ByteArrayInputStream(sb.toString().getBytes()));
    }
    
    执行时,抛出流的while循环语句-
    while((inline=inputReader.readLine())!=null)
    关闭异常

    如果我删除了验证部分,那么处理将按预期进行,当然除了对某些格式错误的XML抛出解析错误。因此,在验证部分,流可能会在某个地方关闭,但我不确定在哪里


    谢谢你的阅读。我感谢你的帮助

    之所以发生这种情况,是因为您通过验证输入流来耗尽并关闭了输入流。你们两个都在养狗,自己也在叫。如果在输入无效时解析已经抛出异常,则根本不需要验证步骤。所以请删除它。

    这是我的老话题:这里有一些其他的解决方案,谢谢!我在中的第一个答案中使用了IOUtils.copy,我只想在服务器向我发送有效XML时进行解析,否则忽略。实施它的最佳方式是什么?