重复读取inputStream
程序员文章站
2024-02-04 08:09:04
...
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的内容了
上一篇: 一篇搞懂React-Native