重复读取inputStream

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中操作指针的方法markreset,两个方法分别为标记和重置,在使用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的内容了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值