大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
inputstream只能读取一次,再次读取则无法获取到内容。这是因为inputStream的内部有个pos指针,当读取的时候指针会不断的移动,当移动到末尾的时候,就无法再次读取了。
问题解决:
方法一:
使用ByteArrayOutputStream将字节缓存,每次读取都从ByteArrayOutputStream里面获取。
获取ByteArrayOutputStream:
public static ByteArrayOutputStream readInputStream(InputStream inputStream) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > -1) {
outputStream.write(buffer, 0, len);
}
outputStream.flush();
return outputStream;
}
我们将inputStream中的数据读取到outputStream之中,然后需要使用Inputstream的时候字节将outputstream中的数据取出
InputStream inputStream1 = new ByteArrayInputStream(outputStream.toByteArray());
InputStream inputStream2 = new ByteArrayInputStream(outputStream.toByteArray());
缺点是如果读取的Inputstream内容很大,使用时会造成很大的内存消耗。
方法二:
使用inputStream中操作指针的方法mark和reset,两个方法分别为标记和重置,在使用inputstream之前我们使用mark标记一下指针的位置,读取完成后使用reset重置指针的位置。
String text = "测试inputStream内容";
InputStream rawInputStream = new ByteArrayInputStream(text.getBytes());
byte[] readArray = new byte[1024];
rawInputStream.mark(0);
System.out.println(DigestUtils.md5Hex(rawInputStream));
rawInputStream.reset();
int readCount2 = rawInputStream.read(readArray);
System.out.println("读取了" + readCount2 + "个字节");
这样就可以重复使用inputStream的内容了
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191089.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...