IT源码网

JAVA中IO流中的推回输入流

shasha 2021年06月03日 编程语言 334 0

要知道,Java中IO流,读取输入流中的内容,是从头到尾顺序读取的,前面读取过的就不会在读取了,所以如果还想读取前面的数据的话,就要用到推回输入流了(PushbackInputStream或PushbackReader)。
例子:

// 创建输入流管道 
Reader reader = new FileReader("D:/java/IO流测试/IOReader2.txt"); 
//  创建推回输入流并指定推回缓冲区大小为5,如果不指定,默认缓冲区大小为1。 
PushbackReader push = new PushbackReader(reader,5);//该缓冲区大小不能小于被推回的数据,也就是现在的缓冲区只能存放5个字符,如若超出会报缓冲区溢出的异常。 
char[] char2 = new char[5];	//创建长度为5的字符数组 
System.out.println(push.read(chars));	//把输入流中读取到的数据存储进数组中 
push.unread(char2);	//把char2数组推回缓冲区中 
char[] char3 = new char[5];	//在创建长度为5的字符数组 
System.out.println(push.read(char3));	//先读取缓冲区内的数据,所以读取到了之前推回缓冲区的那5个字符。 

其实简单来讲就是:
unread(char[] cbuf):将数组推回缓冲区(复制到缓冲区)中,使得下一个读取,会读取缓冲区里面的数据(字符)。
但读取完缓冲区的数据后,下一个读取又会回到之前记录指针记录到的位置开始。
例如:
输入流内有ABCDEFGHIJKLMNOPQRSTUVWXYZ个字符数组A长度为5读取了5个字符[ABCDE],数组B长度为5读取了5个字符[FGHIJ],然后在这把数组A推回缓冲区,也就是说缓冲区现在有5个字符分别是ABCDE,那么后面读取到的将会是缓冲区内的字符,也就是后面的数组C长度为5读取到的字符5个字符是缓冲区里面的[ABCDE],而把缓冲区内的字符读取完后,后面的数组D长度为5读取到的是之前记录指针记录到的位置读取后面的5个字符[KLMNO]。而如果长度为5的数组A读取了5个字符[ABCDE],长度为5的数组B读取了5个字符[FGHIJ],然后在这把数组A推回缓冲区,后面长度为3的数组C读取了缓冲区的3个字符[ABC],长度为5的数组D读取到的是缓冲区内还剩下的两个字符和接上之前记录指针记录到的位置开始读取后面的三个字符[DEKLM]


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

java封装生成Po类方法带备注