InputStream 数据流的重复读取

在需要多次读取InputStream的情况,可以通过ByteArrayOutputStream缓存或使用mark()和reset()方法实现。ByteArrayOutputStream方式可能导致内存压力,适合全部数据都需要的情况。而mark()和reset()则提供了一种标记和重置的策略,但不是所有InputStream都支持。具体实现时,可以考虑使用已支持mark的子类如ByteArrayInputStream和BufferedInputStream。
摘要由CSDN通过智能技术生成

基于业务的需求,我这边需要先读取其中一个字段,然后才能对这个数据流去做相对应得处理,这时就需要进行重复读取

主要有两种方式:一种是通过ByteArrayOutputStream,以缓存的方式去处理

                           第二种是通过mark()和reset()方法,以标记和重置的方式实现

一、ByteArrayOutputStream

  利用ByteArrayOutputStream缓存InputStream,以便InputStream的重复使用
  具体实现:先读取inputStream中的数据 然后写入 ByteArrayOutputStream中 下次可以重复从ByteArrayOutputStream中读取

  缺点:要缓存这个InputStream内存压力可能是比较大的。如果第一次读取只是需要判断该文件流的类型,文件编码等用的话,往往不需要所有的InputStream的数据,或者说只需要前n个字节的话,
 这样一来缓存整个InputStream实际上是一种浪费
 

一、InputStream通过mark和reset方法来实现重复读取

简单来说就是mark(0) 就是“设置字节流的标记,reset()是将“字节流中下一个被读取的位置”重置到“mark()所标记的位置

查看源码:

public synchronized void mark(int readlimit) {}
public synchronized void reset() throws IOException {
    throw new IOException("mark/reset not supported");
}

public boolean markSupported() { return fa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值