本篇文章主要介绍了" InputStream为什么不能被重复读取?",主要涉及到方面的内容,对于Javajrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下:
首先,熟悉Java的人可能都知道,Java中的Inputstream是不能重复读取的。 但是有没有想过,InputStream为什么不能重复读呢? 其实要回答“...
首先,熟悉Java的人可能都知道,Java中的Inputstream是不能重复读取的。 但是有没有想过,InputStream为什么不能重复读呢? 其实要回答“为什么”这个问题很简单,就是人家接口就是这么设计的,不能重复读。 所以今天要讨论的问题更像是:Java的InputStream为什么要设计为不能重复读? 关于InputStream为什么不能重复读取,网上也各有说法: 有的同学说: “InputStream就类比成一个杯子,杯子里的水就像InputStream里的数据,你把杯子里的水拿出来了,杯子的水就没有了,InputStream也是同样的道理。” 比喻的非常好,让我们从直观上认识了InputStream为什么不能重复被读。 也有的同学从更深的代码角度去分析: “在InputStream读取的时候,会有一个pos指针,他指示每次读取之后下一次要读取的起始位置,当读到最后一个字符的时候,pos指针不会重置。” 说的也有道理,就是说InputStream的读取是单向的。但是并不是所有的InputStream实现类都是这样的实现方式。Java代码 
- //BufferedInputStream代码片段:
- public synchronized int read() throws IOException {
- if (pos >= count) {
- fill();
- if (pos >= count)
- return -1;
- }
- return getBufIfOpen()[pos++] & 0xff;
- }
-
- //FileInputStream代码片段:
- public native int read() throws IOException;
我们知道: Java 的List内部是使用数组实现的,遍历的时候也有一个pos指针。但是没有说List遍历一个第二次遍历就没有了。第二次遍历是创建新的Iterator,所以pos也回到了数组起始位置。对于某些InputStream当然可以也这么做。例如:ByteArrayInputStream ByteArrayInputStream就是将一个Java的byte数组保存到对象里,然后读取的时候遍历该byte数组。 Java代码 
- public ByteArrayInputStream(byte buf[]) {
- this.buf = buf;
- this.pos = 0;
- this.count = buf.length;
- }
-
- public synchronized int read() {
- return (pos < count) ? (buf[pos++] & 0xff) : -1;
- }
就ByteArrayInputStream而言,要实现重复读取是很简单的,但是为什么没有。我想是为了遵循InputStream的统一标准。 在InputStream的read方法的注释上明确说明: Java代码 