这篇文章主要介绍“linux系统中InputStream输入流的重置()和马克()命令的用法”,在日常操作中,相信很多人在linux系统中InputStream输入流的重置()和马克()命令的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答“linux系统中InputStream输入流的重置()和马克()命令的用法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
今天写一个读写程序,运用到InputStream的重置方法是发现竟然失败了,然后查了一下JDK源码,发现BufferInputStream重写了父类FilterInputStream的马克和resetf方法,其有支持马克和重置方法的能力。而FileInputStream则没有重写父类InputStream的这两个方法,其不具有马克和重置方法的能力。
在JDK源码中,写到公有同步无效标志(int readlimit)在该输入流中标记当前位置。后续调用重置方法重新将流定位于最后标记位置,以便后续读取能重新读取相同字节。
readlimit参数给出当前输入流在标记位置变为非法前允许读取的字节数。
这句话的意思是说:马克就像书签一样,用于标记,以后再调用复位时就可以再回到这个标记过的地方.mark方法有个参数,通过这个整型参数,你告诉系统,希望在读出这么多个字符之前,这个马克保持有效。比如说马克(10),那么在阅读()10个以内的字符时,重置()操作后可以重新读取已经读出的数据,如果已经读取的数据超过10个,那重置()操作后,就不能正确读取以前的数据了,因为此时马克标记已经失效。
下面是BufferInputStream以及父类FilterInputStream中这两个方法的默认实现//FilterInputStream。java
公有同步无效标志(int readlimit) {in.mark (readlimit);}
公共同步空白重置()抛出IOException {in.reset ();}
& lt; br>公共布尔markSupported () {& lt; br>,,,返回in.markSupported () & lt; br>}
//BufferedInputStream。java
公有同步无效标志(int readlimit) {marklimit=readlimit;
markpos=pos;
}
公共同步空白重置()抛出IOException {getBufIfOpen ();//引起异常closedif (markpos & lt;0)
把新IOException(“重置无效mark"); pos=markpos;
} & lt; br> & lt; br>
公共布尔markSupported () {
返回true;
}//支持马克操作
而FileInputStream没有重写父类InputStream的默认实现,其默认实现如下:
//InputStream。java
公有同步无效标志(int readlimit){}//空实现什么都没有实现公共同步空白重置()抛出IOException{抛出新的IOException(“马克/重置不supported");}//不支持重置操作
公共布尔markSupported () {
返回false;
}//不支持马克操作
下面是一个简单的程序,用于设置复位和马克。
进口java.io.BufferedInputStream;
进口java.io.File;
进口java.io.FileInputStream;
进口java.io.IOException;
进口java.io.InputStream;
公共类TestInputStream {
公共空读(InputStream)抛出IOException{如果(==null) {
返回;
}
int len=0;
in.mark (1),
in.read()//第一次读取
in.reset();//又可以重新读取
in.read()//第二次读取跟第一次读取结果一样,因为只读了一个,没有超过马克设置的整数,所以马克有效}
公共静态void main (String [] args)抛出IOException {TestInputStream测试=new TestInputStream();字符串文件名=癋:/Google.txt";
InputStream in1=new FileInputStream(新文件(文件名));如果(! in1.markSupported ()) {
in1=new BufferedInputStream (in);}
test.read (in); []
字节缓冲区=新字节[100];
(三机一体。读(buf 0 buf.length) !=1) {System.out.println (buf);
}
System.out.println(“成功!“);
}
}
<强>总结:强>
标记公有无效标志(int readlimit)
标记的常规协定是:如果方法markSupported返回真,那么输入流总是在调用马克之后记录所有读取的字节,并时刻准备在调用方法复位时(无论何时),再次提供这些相同的字节。但是,如果在调用重置之前可以从流中读取多于readlimit的字节,则不需要该流记录任何数据。
<强>参数:强>
readlimit -在标记位置失效前可以读取字节的最大限制。
4重置
公共空重置()抛出IOException
将此流重新定位到最后一次对此输入流调用马克方法时的位置。
<强>重置的常规协定是:强>
1,如果方法markSupported返回真,那么:
如果创建流以后未调用方法,或最后调用马克以后从该流读取的字节数大于最后调用马克时的参数,则可能抛出IOException。