Java inputstream和SAXParser出现问题

Java inputstream和SAXParser出现问题,java,android,Java,Android,当我使用HTTPGET特别是超时处理,并通过HttpResponse和passtoxmlR.parse(new-InputSource(instream))获得响应时,我在解析中遇到了问题并生成rest过程。但也有一些错误: 05-08 11:03:38.637: WARN/System.err(522): java.io.IOException: Attempted read on closed stream. 05-08 11:03:38.667: WARN/System.err(522):

当我使用
HTTPGET
特别是超时处理,并通过
HttpResponse
和passto
xmlR.parse(new-InputSource(instream))获得响应时,我在解析中遇到了问题并生成rest过程。但也有一些错误:

05-08 11:03:38.637: WARN/System.err(522): java.io.IOException: Attempted read on closed stream.
05-08 11:03:38.667: WARN/System.err(522):     at org.apache.http.conn.EofSensorInputStream.isReadAllowed(EofSensorInputStream.java:127)
05-08 11:03:38.667: WARN/System.err(522):     at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:176)
05-08 11:03:38.677: WARN/System.err(522):     at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:515)
05-08 11:03:38.677: WARN/System.err(522):     at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:478)
05-08 11:03:38.677: WARN/System.err(522):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:317)
05-08 11:03:38.677: WARN/System.err(522):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:275)
05-08 11:03:38.677: WARN/System.err(522):     at com.housedisplay.mapspec.MyMapActivity.Sendsarchparameter(MyMapActivity.java:334)
05-08 11:03:38.687: WARN/System.err(522):     at com.housedisplay.mapspec.MyMapActivity.access$0(MyMapActivity.java:289)
05-08 11:03:38.697: WARN/System.err(522):     at com.housedisplay.mapspec.MyMapActivity$SearchATask.doInBackground(MyMapActivity.java:251)
05-08 11:03:38.697: WARN/System.err(522):     at com.housedisplay.mapspec.MyMapActivity$SearchATask.doInBackground(MyMapActivity.java:1)
05-08 11:03:38.697: WARN/System.err(522):     at android.os.AsyncTask$2.call(AsyncTask.java:252)
05-08 11:03:38.697: WARN/System.err(522):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-08 11:03:38.697: WARN/System.err(522):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-08 11:03:38.697: WARN/System.err(522):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
05-08 11:03:38.697: WARN/System.err(522):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
05-08 11:03:38.697: WARN/System.err(522):     at java.lang.Thread.run(Thread.java:1020)
代码::

HttpGet httpGet = new HttpGet(strURL.toURI());
            HttpParams httpParameters = new BasicHttpParams();
            // Set the timeout in milliseconds until a connection is established.
            // The default value is zero, that means the timeout is not used. 
            int timeoutConnection = 3000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            // Set the default socket timeout (SO_TIMEOUT) 
            // in milliseconds which is the timeout for waiting for data.
            int timeoutSocket = 5000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpResponse response = httpClient.execute(httpGet);


            HttpEntity entity = response.getEntity();
            InputStream instream = entity.getContent();
            if (entity != null) {

                strResponse = convertStreamToString(instream);


            }
        /**********test*******/
            SAXParserFactory saxPF = SAXParserFactory.newInstance();

            SAXParser saxP = saxPF.newSAXParser();
            XMLReader xmlR = saxP.getXMLReader();
            System.out.println("url >>>>>" + strURL);
            HandlerFromLatLongCustom myXMLHandler = new HandlerFromLatLongCustom();
            xmlR.setContentHandler(myXMLHandler);
            xmlR.parse(new InputSource(instream));
            instream.close();

我怀疑这就是问题所在:

strResponse = convertStreamToString(instream);
我的猜测是,该方法(您没有显示)关闭了流。除此之外,它至少已经读取了流,这将使以后很难再读取

您可以将整个响应读取到字节数组中,然后根据需要将字节数组封装为任意多个
ByteArrayInputStream
s,也可以使用
strResponse
作为解析源。但这可能会引发编码问题

HttpClient可能会为您完成所有这些工作-您只需编写:

instream = entity.getContent();
然后再次获取相同的数据——我对返回的流是否有效“活动”或客户机代码是否读取数据并缓存数据的细节知之甚少

还要注意,此代码非常可疑:

HttpEntity entity = response.getEntity();
InputStream instream = entity.getContent();
if (entity != null) {
    ...

如果
entity
为null,则第二行将已经抛出了
NullPointerException
,使得第三行上的检查毫无意义……

最好使用strResponse=EntityUtils.toString(entity)@user370305:可能是的,但同样,如果这消耗了网络流,也会出现同样的问题。你能马上知道是不是真的吗?从根本上说,我们只能从网络中读取一次数据——因此,如果需要两种形式的数据,就必须有人读取并记住它。