Java中深入浅析的CharArrayReader

  介绍

深入浅析Java中的CharArrayReader ?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

CharArrayReader是字符数组输入流。它和ByteArrayInputStream类似,只不过ByteArrayInputStream是字节数组输入流,而CharArray是字符数组输入流.CharArrayReader是用于读取字符数组,它继承于读者。操作的数据是以字符为单位!


 CharArrayReader (char [] buf)
  CharArrayReader (char[]缓冲区,int抵消,int长度)
  空白close ()
  空白马克(int readLimit)
  布尔markSupported ()
  int read ()
  int读(char[]缓冲区,int抵消,int len)
  布尔准备好()
  空白重置()
  长跳过(长charCount) 

读者是CharArrayReader的父类,我们先看看读者的源码,然后再学CharArrayReader的源码。

<强> 1。读者源码分析(基于jdk1.7.40),

 java包;
  公共抽象类读者实现可读,Closeable {
  保护对象锁;
  保护读者(){
  这一点。锁=;
  }
  保护读者(对象锁){
  如果(锁==null) {
  把新NullPointerException ();
  }
  这一点。锁=锁;
  }
  公共int读(nio。CharBuffer目标)抛出IOException {
  int len=target.remaining ();
  char [] cbuf=new char (len);
  int n=阅读(cbuf 0 len);
  如果(n比;0)
  目标。把(cbuf 0 n);
  返回n;
  }
  公共int read()抛出IOException {
  char cb []=new char [1];
  如果(读(cb 0 1)==1)
  返回1;
  其他的
  返回cb [0];
  }
  公共int读(char cbuf[])抛出IOException {
  返回读取(cbuf 0 cbuf.length);
  }
  抽象的公共int读(char cbuf [], int, int len)抛出IOException;
  私有静态最终int maxSkipBufferSize=8192;
  私人char skipBuffer[]=零;
  公共长跳过(长n)抛出IOException {
  如果(n & lt;L)
  把新IllegalArgumentException (“negative"跳过值);
  int nn=(int)数学。分钟(n, maxSkipBufferSize);
  同步(锁){
  如果((skipBuffer==null) | | (skipBuffer。长度& lt;nn))
  而(r比;0) {
  int数控=阅读(skipBuffer 0 (int)数学。分钟(r, nn));
  如果(数控==1)
  打破;
  r -=数控;
  }
  返回n - r;
  }
  }
  公众准备好布尔()抛出IOException {
  返回错误;
  }
  公共布尔markSupported () {
  返回错误;
  }
  公共空马克(int readAheadLimit)抛出IOException {
  把新的IOException(“马克()不是supported");
  }
  公共空间重置()抛出IOException {
  把新IOException(“重置()不是supported");
  }
  抽象的公共空close()抛出IOException;
  }

2。CharArrayReader源码分析(基于jdk1.7.40),

 java包;
  公开课CharArrayReader延伸读者{//字符数组缓冲
  保护char buf [];//下一个被获取的字符的位置
  保护int pos;//被标记的位置
  保护int markedPos=0;//字符缓冲的长度
  保护int数;//构造函数
  公共CharArrayReader (char buf []) {
  这一点。buf=缓冲区;
  这一点。pos=0;
  这一点。数=buf.length;
  }//构造函数
  如果(抵消& lt;0)| |(偏移量比;buf.length) | |(长度& lt;0)| |
  ((抵消+长度)& lt;0)){
  把新IllegalArgumentException ();
  }
  这一点。buf=缓冲区;
  这一点。pos=抵消;
  这一点。数=数学。min(偏移量+长度,buf.length);
  这一点。markedPos=抵消;
  }//判断”CharArrayReader是否有效”。//若字符缓冲为null,则认为其无效。
  私人空间ensureOpen()抛出IOException {
  如果(buf==null)
  把新IOException(“流closed");
  }//读取下一个字符。即返回字符缓冲区中下一位置的值。//注意:读取的是字符!
  公共int read()抛出IOException {
  同步(锁){
  ensureOpen ();
  如果(pos祝辞=数)
  返回1;
  其他的
  返回缓冲区(pos + +);
  }
  }//读取数据,并保存到字符数b组中从从开始的位置中,len是读取长度。
  公共int读(char [], int, int len)抛出IOException {
  同步(锁){
  ensureOpen ();
  如果((& lt;(0)| |比;b.length) | | (len & lt;0)| |
  ((+ len)比;b.length) | | ((+ len) & lt;0)){
  把新IndexOutOfBoundsException ();
  }else if (len==0) {
  返回0;
  }
  如果(pos祝辞=count) {
  返回-;
  }
  如果(pos + len祝辞数){
  len=count - pos;
  }
  如果(len & lt;=0) {
  返回0;
  }
  系统。arraycopy (buf、pos、b, len);
  pos +=兰;
  返回兰;
  }
  }//跳过n个字符
  公共长跳过(长n)抛出IOException {
  同步(锁){
  ensureOpen ();
  如果(pos + n比;数){
  n=count - pos;
  }
  如果(n & lt;0) {
  返回0;
  }
  pos +=n;
  返回n;
  }
  }//判断”是否能读取下一个字符”。能的话,返回现实。
  公众准备好布尔()抛出IOException {
  同步(锁){
  ensureOpen ();
  返回(计数- pos)比;;
  }
  }
  公共布尔markSupported () {
  返回true;
  }//保存当前位置.readAheadLimit在此处没有任何实际意义//标记()必须和重置()配合使用才有意义!
  公共空马克(int readAheadLimit)抛出IOException {
  同步(锁){
  ensureOpen ();
  markedPos=pos;
  }
  }//重置”下一个读取位置”为“马克所标记的位置”
  公共空间重置()抛出IOException {
  同步(锁){
  ensureOpen ();
  pos=markedPos;
  }
  }
  公共空间close () {
  buf=零;
  }
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

Java中深入浅析的CharArrayReader