JAVA获取InputStream的contentLength问题

feige74110 2011-06-09 11:34:29
InputStream in = method.getResponseBodyAsStream();
byte[] testBytes = new byte[in.available()];
while (in.read(testBytes) != -1) {
filesize += testBytes.length;
testBytes = new byte[in.available()];
}


我用断点可以看到 in 里面contentLength有值,也就是文件的大小

但是开始while计算文件的大小就不行了

以上代码 我在项目中调用执行到while部分就不执行了 ,但是用main还是调用的时候就可以输出文件大小

项目中调用和main函数中换入的参数一样

请各位指点
...全文
2327 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
新IT民工 2011-06-09
  • 打赏
  • 举报
回复
这么简单的问题也要问啊
xiaohe8503 2011-06-09
  • 打赏
  • 举报
回复
sorry 下面不用了

try {
is2.readFully(buf2);
count+=len;
} catch (Exception e) {}

替换为count+=len;
xiaohe8503 2011-06-09
  • 打赏
  • 举报
回复 1
in.available() available是表示在不阻塞的情况下,还可以读取多少个字节。而不是指这个流还有多长!
对于网络流来说,这个是不确定的,所以你不能使用这个方法来判断读取数据长度

我想断点测试不好测,main方法中能用说明不是你们说的死循环

可以试试这个方法
byte[] buf1 = new byte[1024];
int len = -1;
int count=0;
while ((len = is1.read(buf1)) != -1) {
byte[] buf2 = new byte[len];
try {
is2.readFully(buf2);
count+=len;
} catch (Exception e) {}
System.out.println("count"+count);
feige74110 2011-06-09
  • 打赏
  • 举报
回复
没想到喜欢装 b的人越来越多了
新IT民工 2011-06-09
  • 打赏
  • 举报
回复
笨啊,用method的getResponseBody方法直接就可以获取到content了么,有了content的字符数组,计算长度肯定没问题啊
byte[] responseBody = getMethod.getResponseBody();
计算responseBody的长度不就是content的长度么。
lxbccsu 2011-06-09
  • 打赏
  • 举报
回复
in.read(testBytes)如果testBytes的长度为0,会返回0;所以是死循环;
lxbccsu 2011-06-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 feige74110 的回复:]
引用 2 楼 lxbccsu 的回复:
如果代码测试可行,不管在哪个方法中运行都是一样的;

不过楼主的代码是有问题的,会死循环,不知道怎么说main方法可以的:
去掉 testBytes = new byte[in.available()];

你放在while中相当于无限创建新的缓存,每次重新开始读,while(in.read(testBytes) != -1) 永远为false,……
[/Quote]

上面说错了一点;就是in.available()在到达文件末尾时返回0;
所以testBytes = new byte[in.available()];会得到一个长度为0的数组, while (in.read(testBytes) != -1) 会进入一个 死循环;不是因为 每次重新开始读...
feige74110 2011-06-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lxbccsu 的回复:]
如果代码测试可行,不管在哪个方法中运行都是一样的;

不过楼主的代码是有问题的,会死循环,不知道怎么说main方法可以的:
去掉 testBytes = new byte[in.available()];

你放在while中相当于无限创建新的缓存,每次重新开始读,while(in.read(testBytes) != -1) 永远为false,返回不了-1;
[/Quote]

我用main函数测试的时候,可以准确的获取到文件的大小

在项目方法中调用的时候,进入循环以后 就如同 泥牛入海一样

用断点跟踪也是,到循环以后就没了
feige74110 2011-06-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 loveuserzzz 的回复:]
这么简单的问题也要问啊
[/Quote]

我用main函数测试的时候,可以准确的获取到文件的大小

在项目方法中调用的时候,进入循环以后 就如同 泥牛入海一样

用断点跟踪也是,到循环以后就没了
lxbccsu 2011-06-09
  • 打赏
  • 举报
回复
永远为true,写错了
lxbccsu 2011-06-09
  • 打赏
  • 举报
回复
如果代码测试可行,不管在哪个方法中运行都是一样的;

不过楼主的代码是有问题的,会死循环,不知道怎么说main方法可以的:
去掉 testBytes = new byte[in.available()];

你放在while中相当于无限创建新的缓存,每次重新开始读,while(in.read(testBytes) != -1) 永远为false,返回不了-1;

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧