Java基础知识之CharArrayReader流的使用

作者:咕噜是个大胖子 时间:2023-02-12 10:40:29 

Java CharArrayReader流

一、CharArrayReader流定义

API说明:该类实现了一个可用作字符输入流的字符缓冲区,即该类可利用字符缓冲区当做字符输入流进行读取工作

二、CharArrayReader流的构造函数

1)从指定字符数组构造CharArrayReader流对象


/**
    * 利用指定字符数组创建CharArrayReader对象
    * 本质是将字符数组赋值给对象的字符缓冲区
    */
   public CharArrayReader(char buf[]) {
       this.buf = buf;
       this.pos = 0;
       this.count = buf.length;
   }

构造流程图:

Java基础知识之CharArrayReader流的使用

2)从指定字符数组构造CharArrayReader流对象,CharArrayReader流从偏移量offset开始读取,能读取的最大长度值可以是leng或者buf.leng-offset的最小值


  public CharArrayReader(char buf[], int offset, int length) {
       if ((offset < 0) || (offset > buf.length) || (length < 0) ||
           ((offset + length) < 0)) {
           throw new IllegalArgumentException();
       }
       this.buf = buf;
       this.pos = offset;
       this.count = Math.min(offset + length, buf.length);
       this.markedPos = offset;
   }

构造示例图:

Java基础知识之CharArrayReader流的使用

三、CharArrayReader流的实例域


   /** 字符缓冲区 */
   protected char buf[];

/** 缓冲区当前位置 */
   protected int pos;

/** 标记在缓冲区中的位置 */
   protected int markedPos = 0;

/**
    * 缓冲区结束的索引,该索引或者之外没有有效数据
    * 即缓冲区的长度值
    */
   protected int count;

四、CharArrayReader流的API

1)read():读取单个字符并返回,当读取到缓冲区末尾时,返回-1


public int read() throws IOException {
       synchronized (lock) {
           ensureOpen();
           if (pos >= count) //当前位置大于等于结束索引时,代表缓冲区内容已读取到尾部,返回-1
               return -1;
           else
               return buf[pos++];   //直接换回缓冲区字符
       }
   }

2)read(char b[], int off, int len):读取最多len个字符到目标数组中,返回实际读取的字符数,当读取到缓冲区末尾时,返回-1


   public int read(char b[], int off, int len) throws IOException {
       synchronized (lock) {
           ensureOpen();
           if ((off < 0) || (off > b.length) || (len < 0) ||
               ((off + len) > b.length) || ((off + len) < 0)) {
               throw new IndexOutOfBoundsException();
           } else if (len == 0) {
               return 0;
           }

if (pos >= count) { //字符缓冲区数据已读取完毕
               return -1;
           }
           if (pos + len > count) { //字符缓冲区当前位置读取len个字节后超出界限的话,则只读当前位置到结束索引的字节
               len = count - pos;
           }
           if (len <= 0) {         //感觉此if多余
               return 0;
           }
           System.arraycopy(buf, pos, b, off, len); //从字符缓冲区中读取len个字节到目标数组中
           pos += len; //修改字符缓冲区当前位置
           return len;
       }
   }

3)close():关闭流并释放与其相关的资源(),关闭后调用其方法会抛出IOException异常


/**
    *关闭流并释放资源--本质是将缓冲区赋值为null,则该流其它方法都不能使用
    *根本就没有调用过系统资源,因此关闭是无效的?但是一旦关闭在调用其他方法,就会抛异常
    */
   public void close() {
       buf = null;
   }

/** 确保流不被关闭 */
   private void ensureOpen() throws IOException {
       if (buf == null)
           throw new IOException("Stream closed");
   }

四、CharArrayReader流的作用

从API说明以及其实例域和方法来看,其就是利用了一个字符数组创建字符缓冲区而后充当所谓的字符缓冲流进行字符读取工作,本质没有与底层的文件这些建立联系

对该流在网上进行过咨询,解释为该流可以作为临时的字符数组内存使用,运行结束后自动删除--因为个人暂未在实际项目中暂未使用到这个流,因此对此答案也无法确信,只能先理解其功能,至于具体的作用和什么时候使用,待以后了解了再补充

聊聊什么是CharArrayReader

CharArrayReader 是一个把字符数组作为源的输入流的实现。该类有两个构造函数,每一个都需要一个字符数组提供数据源:


CharArrayReader(char array[ ])
CharArrayReader(char array[ ], int start, int numChars)

这里,array是输入源。第二个构造函数从你的字符数组的子集创建了一个Reader,该子集以start指定的索引开始,长度为numChars。

下面的例子用到了上CharArrayReader的两个构造函数


// Demonstrate CharArrayReader.
import java.io.*;
public class CharArrayReaderDemo {
public static void main(String args[]) throws IOException {
String tmp = "abcdefghijklmnopqrstuvwxyz";
int length = tmp.length();
char c[] = new char[length];
tmp.getChars(0, length, c, 0);
CharArrayReader input1 = new CharArrayReader(c);
CharArrayReader input2 = new CharArrayReader(c, 0, 5);
int i;
System.out.println("input1 is:");
while((i = input1.read()) != -1) {
System.out.print((char)i);
}
System.out.println();
System.out.println("input2 is:");
while((i = input2.read()) != -1) {
System.out.print((char)i);
}
System.out.println();
}
}

input1对象由全部的小写字母构造,而input2 值包含最初的5个字符。

下面是输出

input1 is:
abcdefghijklmnopqrstuvwxyz
input2 is:
abcde

来源:https://blog.csdn.net/ai_bao_zi/article/details/81333622

标签:Java,CharArrayReader,CharArrayReader流
0
投稿

猜你喜欢

  • android开机自启动app示例分享

    2023-02-20 18:04:29
  • Java中ArrayList集合的常用方法大全

    2023-09-01 15:23:30
  • 使用Jenkins来构建SVN+Maven项目的实现

    2023-07-30 12:45:22
  • 深入理解Javascript中的this关键字

    2022-03-08 16:52:25
  • Java设计模式之享元模式实例详解

    2021-12-19 17:54:00
  • 解决RabbitMq消息队列Qos Prefetch消息堵塞问题

    2021-11-17 17:36:13
  • Java中的异常处理用法及其架构和使用建议

    2023-02-05 21:27:16
  • Java输入输出流实例详解

    2023-05-28 15:54:35
  • Java实现文件上传到服务器本地并通过url访问的方法步骤

    2021-12-01 11:45:20
  • SpringBoot配置shiro安全框架的实现

    2023-09-07 19:55:38
  • Android SwipeRefreshLayout超详细讲解

    2023-08-22 13:43:28
  • java求数组元素重复次数和java字符串比较大小示例

    2023-08-04 22:20:02
  • Java8如何将Array转换为Stream的实现代码

    2022-09-15 06:41:31
  • 完整的医院就诊挂号系统基于Spring MVC + Spring + MyBatis实现

    2022-06-03 18:07:05
  • 清楚详解Android 进程间图传递图形buffer原理

    2023-05-14 12:57:09
  • Android7.0自动更新适配 包解析异常

    2022-02-13 11:21:00
  • Kotlin利用Regex如何构建正则表达式详解

    2022-12-25 18:31:10
  • C++多重继承与虚继承分析

    2023-04-22 14:49:16
  • IDEA 单元测试报错:Class not found:xxxx springboot的解决

    2022-05-11 01:11:02
  • Java实现聊天机器人完善版

    2022-10-07 09:31:11
  • asp之家 软件编程 m.aspxhome.com