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;
}
构造流程图:
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;
}
构造示例图:
三、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


猜你喜欢
- 一、FeignClient注解FeignClient注解被@Target(ElementType.TYPE)修饰,表示FeignClient
- 最近几个项目的测试结果,Android无法主动通过调用 webview.loadUrl("javascript:"+ca
- 本文实例讲述了C#生成随机ArrayList的方法。分享给大家供大家参考。具体实现方法如下:public static void Rando
- 一.static关键字的用途在《Java编程思想》P86页有这样一段话:“static方法就是没有this的方法。在st
- 实例如下:ServletRequestAttributes aRequestAttributes=(ServletRequestAttrib
- 一、方法的定义1.方法体中最后返回值可以使用return, 如果使用了return, 那么方法体的返回值类型一定要指定2.如果方法体重没有r
- 官方文档 8.0Spring为不同缓存做了一层抽象,这里通过阅读文档以及源码会对使用以及原理做一些学习笔记。1.简介
- 一、项目简述功能包括: 用户管理,系统管理,客户管理,客户服务,客户关怀, 销售机会,统计管理等等。二、项目运行环境配置: Jdk1.8 +
- 1.Semaphore的概述public class Semaphore extends Object implements Seriali
- 1、对属性进行封装,使用户不能直接输入数据,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值。则需要将属性声明为
- 在JVM中,每个对象都关联一个监视器,这里的对象包含Object实例和Class实例。监视器是一个同步工具,相当于一个许可证,拿到许可证的线
- 先给大家展示下效果图,如果感觉不错,请参考实现思路详解Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安
- Android 消息机制1.概述Android应用启动时,会默认有一个主线程(UI线程),在这个线程中会关联一个消息队列(MessageQu
- 本文实例为大家分享了C#生成验证码图片的具体代码,供大家参考,具体内容如下/// <summary>
- 大致思路:注解实现方式:就是用 反射机制. 获取指定的包下使用了注解的类,存储在一个map容器, 然后获取map容器下类的属性, 利用反射给
- 一、简介CyclicBarrier 字面意思回环栅栏(循环屏障),它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是
- 前 言终于来到下篇了,通过上篇,和中篇,我们了解了linq的基本语句,对应linq我们又了解到lambda表达式,静态扩展方法,以及linq
- 目录小写 string 与大写 String声明与初始化 stringstring 的不可变性正则 string 与原义 stringstr
- 在上一节,我们已经完成了项目的整体技术架构设计和具体的数据库设计,接下来,我们搭建整体的开发框架。开发工具选用Idea。开发工具只是为了提高
- 目录认识@Import注解搭建项目结构用于测试@Import用法最佳搭档 - @Import通用形式总结认识@Import注解先看一下源码@