Java 中的CharArrayReader 介绍_动力节点Java学院整理
CharArrayReader介绍
CharArrayReader是字符数组输入流。它和ByteArrayInputStream类似,只不过ByteArrayInputStream是字节数组输入流,而CharArray是字符数组输入流。CharArrayReader是用于读取字符数组,它继承于Reader。操作的数据是以字符为单位!
CharArrayReader函数列表
CharArrayReader(char[]buf) CharArrayReader(char[]buf,intoffset,intlength) voidclose() voidmark(intreadLimit) booleanmarkSupported() intread() intread(char[]buffer,intoffset,intlen) booleanready() voidreset() longskip(longcharCount)
Reader和CharArrayReader源码分析
Reader是CharArrayReader的父类,我们先看看Reader的源码,然后再学CharArrayReader的源码。
1.Reader源码分析(基于jdk1.7.40)
packagejava.io; publicabstractclassReaderimplementsReadable,Closeable{ protectedObjectlock; protectedReader(){ this.lock=this; } protectedReader(Objectlock){ if(lock==null){ thrownewNullPointerException(); } this.lock=lock; } publicintread(java.nio.CharBuffertarget)throwsIOException{ intlen=target.remaining(); char[]cbuf=newchar[len]; intn=read(cbuf,0,len); if(n>0) target.put(cbuf,0,n); returnn; } publicintread()throwsIOException{ charcb[]=newchar[1]; if(read(cb,0,1)==-1) return-1; else returncb[0]; } publicintread(charcbuf[])throwsIOException{ returnread(cbuf,0,cbuf.length); } abstractpublicintread(charcbuf[],intoff,intlen)throwsIOException; privatestaticfinalintmaxSkipBufferSize=8192; privatecharskipBuffer[]=null; publiclongskip(longn)throwsIOException{ if(n0){ intnc=read(skipBuffer,0,(int)Math.min(r,nn)); if(nc==-1) break; r-=nc; } returnn-r; } } publicbooleanready()throwsIOException{ returnfalse; } publicbooleanmarkSupported(){ returnfalse; } publicvoidmark(intreadAheadLimit)throwsIOException{ thrownewIOException("mark()notsupported"); } publicvoidreset()throwsIOException{ thrownewIOException("reset()notsupported"); } abstractpublicvoidclose()throwsIOException; }
2.CharArrayReader源码分析(基于jdk1.7.40)
packagejava.io; publicclassCharArrayReaderextendsReader{ //字符数组缓冲 protectedcharbuf[]; //下一个被获取的字符的位置 protectedintpos; //被标记的位置 protectedintmarkedPos=0; //字符缓冲的长度 protectedintcount; //构造函数 publicCharArrayReader(charbuf[]){ this.buf=buf; this.pos=0; this.count=buf.length; } //构造函数 if((offset<0)||(offset>buf.length)||(length<0)|| ((offset+length)<0)){ thrownewIllegalArgumentException(); } this.buf=buf; this.pos=offset; this.count=Math.min(offset+length,buf.length); this.markedPos=offset; } //判断“CharArrayReader是否有效”。 //若字符缓冲为null,则认为其无效。 privatevoidensureOpen()throwsIOException{ if(buf==null) thrownewIOException("Streamclosed"); } //读取下一个字符。即返回字符缓冲区中下一位置的值。 //注意:读取的是字符! publicintread()throwsIOException{ synchronized(lock){ ensureOpen(); if(pos>=count) return-1; else returnbuf[pos++]; } } //读取数据,并保存到字符数组b中从off开始的位置中,len是读取长度。 publicintread(charb[],intoff,intlen)throwsIOException{ synchronized(lock){ ensureOpen(); if((off<0)||(off>b.length)||(len<0)|| ((off+len)>b.length)||((off+len)<0)){ thrownewIndexOutOfBoundsException(); }elseif(len==0){ return0; } if(pos>=count){ return-; } if(pos+len>count){ len=count-pos; } if(len<=0){ return0; } System.arraycopy(buf,pos,b,off,len); pos+=len; returnlen; } } //跳过n个字符 publiclongskip(longn)throwsIOException{ synchronized(lock){ ensureOpen(); if(pos+n>count){ n=count-pos; } if(n<0){ return0; } pos+=n; returnn; } } //判断“是否能读取下一个字符”。能的话,返回true。 publicbooleanready()throwsIOException{ synchronized(lock){ ensureOpen(); return(count-pos)>; } } publicbooleanmarkSupported(){ returntrue; } //保存当前位置。readAheadLimit在此处没有任何实际意义 //mark()必须和reset()配合使用才有意义! publicvoidmark(intreadAheadLimit)throwsIOException{ synchronized(lock){ ensureOpen(); markedPos=pos; } } //重置“下一个读取位置”为“mark所标记的位置” publicvoidreset()throwsIOException{ synchronized(lock){ ensureOpen(); pos=markedPos; } } publicvoidclose(){ buf=null; } }
说明:
CharArrayReader实际上是通过“字符数组”去保存数据。
(01)通过CharArrayReader(char[]buf)或CharArrayReader(char[]buf,intoffset,intlength),我们可以根据buf数组来创建CharArrayReader对象。
(02)read()的作用是从CharArrayReader中“读取下一个字符”。
(03)read(char[]buffer,intoffset,intlen)的作用是从CharArrayReader读取字符数据,并写入到字符数组buffer中。offset是将字符写入到buffer的起始位置,len是写入的字符的长度。
(04)markSupported()是判断CharArrayReader是否支持“标记功能”。它始终返回true。
(05)mark(intreadlimit)的作用是记录标记位置。记录标记位置之后,某一时刻调用reset()则将“CharArrayReader下一个被读取的位置”重置到“mark(intreadlimit)所标记的位置”;也就是说,reset()之后再读取CharArrayReader时,是从mark(intreadlimit)所标记的位置开始读取。
示例代码
关于CharArrayReader中API的详细用法,参考示例代码(CharArrayReaderTest.java):
/** *CharArrayReader演示程序 * * */ importjava.io.CharArrayReader; importjava.io.CharArrayWriter; importjava.io.IOException; publicclassCharArrayReaderTest{ privatestaticfinalintLEN=5; //对应英文字母“abcdefghijklmnopqrstuvwxyz” privatestaticfinalchar[]ArrayLetters=newchar[]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; publicstaticvoidmain(String[]args){ tesCharArrayReader(); } /** *CharArrayReader的API测试函数 */ privatestaticvoidtesCharArrayReader(){ try{ //创建CharArrayReader字符流,内容是ArrayLetters数组 CharArrayReadercar=newCharArrayReader(ArrayLetters); //从字符数组流中读取5个字符 for(inti=;i运行结果:
0:a 1:b 2:c 3:d 4:e buf=klmno buf=fghij以上所述是小编给大家介绍的Java中的CharArrayReader知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!