linux系统中InputStream输入流的方法之reset()和mark(
今天写一个读写程序,运用到InputStream的reset方法是发现竟然失败了,然后查了一下JDK源码,发现BufferInputStream重写了父类FilterInputStream的mark和resetf方法,其有支持 mark 和 reset 方法的能力。而FileInputStream则没有重写父类InputStream的这两个方法,其不具有mark和reset方法的能力。
在JDK源码中,写到public synchronized void mark(t readlimit)在该输入流中标记当前位置。 后续调用 reset 方法重新将流定位于标记位置,以便后续读取能重新读取相同字节。
readlimit 参数给出当前输入流在标记位置变为非法前允许读取的字节数。
这句话的意思是说mark就像书签一样,用于标记,以后再调用reset时就可以再回到这个mark过的地方。mark方法有个参数,通过这个整型参数,你告诉系统,希望在读出这么多个字符之前,这个mark保持有效。比如说mark(10),那么在read()10个以内的字符时,reset()操作后可以重新读取已经读出的数据,如果已经读取的数据超过10个,那reset()操作后,就不能正确读取以前的数据了,因为此时mark标记已经失效。
下面是BufferInputStream以及父类FilterInputStream 中这两个方法的默认实现//FilterInputStream.java
public synchronized void mark(t readlimit) {.mark(readlimit);
}
public synchronized void reset() throws IOException {.reset();
}
<br>public boolean markSupported() {<br> return .markSupported()<br>}
//BufferedInputStream.java
public synchronized void mark(t readlimit) {marklimit = readlimit;
markpos = pos;
}
public synchronized void reset() throws IOException {getBufIfOpen(); // Cause exception if closedif (markpos < 0)
throw new IOException("Resettg to valid mark");pos = markpos;
}<br><br>
public boolean markSupported() {
return true;
} //支持mark操作
而FileInputStream没有重写父类InputStream的默认实现,其默认实现如下
//InputStream.java
public synchronized void mark(t readlimit) {}//空实现什么都没有实现public synchronized void reset() throws IOException {throw new IOException("mark/reset not supported");}//不支持reset操作
public boolean markSupported() {
return false;
} //不支持mark操作
下面是一个简单的程序,用于设置reset和mark.
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class TestInputStream {
public void read(InputStream ) throws IOException {if( == null) {
return;
}
t len=0;
.mark(1);
.read() //第一次读取
.reset();//又可以重新读取
.read()//第二次读取跟第一次读取结果一样。因为只读了一个,没有超过mark设置的整数。所以mark有效}
public static void ma(Strg[] args) throws IOException {TestInputStream test = new TestInputStream();Strg fileName = "F:/Google.txt";
InputStream 1 = new FileInputStream(new File(fileName));if(!1.markSupported()) {
1 = new BufferedInputStream(1);
}
test.read(1);
byte[] buf = new byte[100];
while(1.read(buf, 0, buf.length)!=-1) {System.out.prtln(buf);
}
System.out.prtln("Suess!");
}
}
mark
public void mark(t readlimit)
mark 的常规协定是如果方法 markSupported 返回 true,那么输入流总是在调用 mark 之后记录所有读取的字节,并时刻准备在调用方法 reset 时(无论何时),提供这些相同的字节。,如果在调用 reset 之前可以从流中读取多于 readlimit 的字节,则不需要该流记录任何数据。
参数
readlimit - 在标记位置失效前可以读取字节的最大限制。
4 reset
public void reset() throws IOException
将此流重新定位到一次对此输入流调用 mark 方法时的位置。
reset 的常规协定是
1、如果方法 markSupported 返回 true,那么
如果创建流以后未调用方法 mark,或调用 mark 以后从该流读取的字节数大于调用 mark 时的参数,则可能抛出 IOException。
如果未抛出这样的 IOException,则将该流重新设置为这种状态最近一次调用 mark 以后(如果未调用过 mark,则从文件开头开始)读取的所有字节将重新提供给 read 方法的后续调用者,后跟任何从调用 reset 时起将作为下一输入数据的字节。
2、如果方法 markSupported 返回 false,那么
对 reset 的调用可能抛出 IOException。
如果未抛出 IOException,则将该流重新设置为一种固定状态,该状态取决于输入流的特定类型及其创建方式。提供给 read 方法后续调用者的字节取决于特定类型的输入流。
除了抛出 IOException 之外,类 InputStream 的方法 reset 不执行任何操作。
抛出
IOException - 如果未标记此流或该标记失效。
以上就是在lux系统中InputStream输入流的方法的注意事项,谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。
网络推广
- 5g网络有多快:5g网络网速有多快
- dota2无法连接至steam网络 为什么无法连接dota2网络
- 无线网络信号接收器 无线网络信号接收器怎么用
- 网络延时是什么意思 网络延时是什么原因
- 无线网络不可用:无线网络不可用是什么原因
- 网络广告销售技巧 网络广告销售技巧有哪些
- 智能手机网络设置 智能手机网络设置在哪里
- 为什么找不到无线网络 为什么找不到无线网络信
- 网络这么赚钱:网络怎么能赚到钱
- 为什么无线网络连接不上 为什么无线网连不起来
- 网络上的人际交往 网络上人际交往的优势
- 支付宝网络系统异常 支付宝显示网络异常什么时
- 营销软件:营销软件有哪些
- 无法访问您要使用的功能所在的网络位置
- 网络安全基本知识 网络安全基本知识有哪些
- 什么网络电话最好用 什么网络电话最好用最便宜