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知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!