java – HttpURLConnection读取InputStream两次

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

因此我无法标记()和重置()流,在日志中写入响应后我无法解析它.当然,我可以将响应读入String或其他内容,记录它们,然后解析.但是当我使用流时,我正在避免潜在的OutOfMemomryError,因为流处理缓冲而不是我.

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

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

解决方法:

我不确定我是否完全理解,你想读一次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();
    }
}
上一篇:java – 没有发生HttpUrlConnection重定向到其他servlet


下一篇:java – Android HttpURLConnection PUT到亚马逊AWS S3 403错误