4

我通过向服务器发出http get请求HttpURLConnection,我需要读取响应(InputStream)两次:用于记录目的和解析响应。返回的是不支持标记(return )InputStraem的实例。org.apache.harmony.luni.internal.net.www.protocol.http.ChunkedInputStreamis.markSupported()false

因此我不能流式传输mark()并且reset()在日志中写入响应后我无法解析它。当然,我可以将响应读入一次String或其他内容,记录它们并稍后解析。但是当我使用流时,我可能会避免OutOfMemomryError,因为流处理缓冲而不是我。

在这种情况下,什么是最好的解决方案,它可以保持使用流的好处并帮助实现预期的结果:同时记录到日志和解析响应?

编辑:将响应写入临时文件的解决方案不合适

4

3 回答 3

4

我不确定我是否完全理解,你想读InputStream一次(不是真的两次,这有点不干净IMO,因为如果错误只发生在日志流而不是你正在解析的流上怎么办?)然后简单地记录和解析一样InputStream吗?

如果是上面的情况,这里伪显示解决方案:

InputStream is=...;
byte[] bytes=new byte[1028];
while(is.read(bytes)!=-1) {
log(bytes); //call function to log
parse(bytes);//call function to parse
}

对于同时记录和记录,更好的方法是为这两种方法创建一个新的Thread/ Runnable,启动它们并使用 ( ) 等待它们返回thread.join();

InputStream is=...;
byte[] bytes=new byte[1028];
while(is.read(bytes)!=-1) {
Thread t1=new Thread(new Runnable() {
        @Override
        public void run() {
          log(bytes); //call function to log
        }
    });
Thread t2=new Thread(new Runnable() {
        @Override
        public void run() {
           parse(bytes);//call function to parse
        }
    });
     t1.start();
     t2.start();
try {
     t1.join();
     t2.join();
    }catch(Exception ex) {
      ex.printStackTrace();
    }
}
于 2012-09-18T08:48:06.890 回答
2

您永远不需要读取输入流两次。在阅读时记录下来。

于 2012-09-18T08:57:57.163 回答
0

如果您事先不知道流的潜在大小(或者如果它太大而无法放入 aString或 a中byte[]),那么我将使用 theInputStreamHttpURLConnection记录(如果需要,可能在单独的文件中)和我将使用日志文件进行解析。

这可能不是最有效的复制方式,InputStream但可能是最安全的内存方式之一。

于 2012-09-18T08:44:59.107 回答