java – HttpURLConnection读取InputStream两次
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – HttpURLConnection读取InputStream两次,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1425字,纯文字阅读大概需要3分钟。
内容图文
![java – HttpURLConnection读取InputStream两次](/upload/InfoBanner/zyjiaocheng/816/e955dd25278445358e1e171a5a5b1557.jpg)
我通过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读取InputStream两次全部内容,希望文章能够帮你解决java – HttpURLConnection读取InputStream两次所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。