我通过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();
}
}