CharArrayReader 介绍

CharArrayReader 是字符数组输入流。它和ByteArrayInputStream类似,只不过ByteArrayInputStream是字节数组输入流,而CharArray是字符数组输入流。CharArrayReader 是用于读取字符数组,它继承于Reader。操作的数据是以字符为单位!
CharArrayReader 函数列表
CharArrayReader(char[] buf) CharArrayReader(char[] buf, int offset, int length) void close() void mark(int readLimit) boolean markSupported() int read() int read(char[] buffer, int offset, int len) boolean ready() void reset() long skip(long charCount)
Reader和CharArrayReader源码分析
Reader是CharArrayReader的父类,我们先看看Reader的源码,然后再学CharArrayReader的源码。
1. Reader源码分析(基于jdk1.7.40)
package java.io;
public abstract class Reader implements Readable, Closeable {
protected Object lock;
protected Reader() {
this.lock = this;
}
protected Reader(Object lock) {
if (lock == null) {
throw new NullPointerException();
}
this.lock = lock;
}
public int read(java.nio.CharBuffer target) throws IOException {
int len = target.remaining();
char[] cbuf = new char[len];
int n = read(cbuf, 0, len);
if (n > 0)
target.put(cbuf, 0, n);
return n;
}
public int read() throws IOException {
char cb[] = new char[1];
if (read(cb, 0, 1) == -1)
return -1;
else
return cb[0];
}
public int read(char cbuf[]) throws IOException {
return read(cbuf, 0, cbuf.length);
}
abstract public int read(char cbuf[], int off, int len) throws IOException;
private static final int maxSkipBufferSize = 8192;
private char skipBuffer[] = null;
public long skip(long n) throws IOException {
if (n < L)
throw new IllegalArgumentException("skip value is negative");
int nn = (int) Math.min(n, maxSkipBufferSize);
synchronized (lock) {
if ((skipBuffer == null) || (skipBuffer.length < nn))
while (r > 0) {
int nc = read(skipBuffer, 0, (int)Math.min(r, nn));
if (nc == -1)
break;
r -= nc;
}
return n - r;
}
}
public boolean ready() throws IOException {
return false;
}
public boolean markSupported() {
return false;
}
public void mark(int readAheadLimit) throws IOException {
throw new IOException("mark() not supported");
}
public void reset() throws IOException {
throw new IOException("reset() not supported");
}
abstract public void close() throws IOException;
}
2. CharArrayReader 源码分析(基于jdk1.7.40)
package java.io;
public class CharArrayReader extends Reader {
// 字符数组缓冲
protected char buf[];
// 下一个被获取的字符的位置
protected int pos;
// 被标记的位置
protected int markedPos = 0;
// 字符缓冲的长度
protected int count;
// 构造函数
public CharArrayReader(char buf[]) {
this.buf = buf;
this.pos = 0;
this.count = buf.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是否有效”。
// 若字符缓冲为null,则认为其无效。
private void ensureOpen() throws IOException {
if (buf == null)
throw new IOException("Stream closed");
}
// 读取下一个字符。即返回字符缓冲区中下一位置的值。
// 注意:读取的是字符!
public int read() throws IOException {
synchronized (lock) {
ensureOpen();
if (pos >= count)
return -1;
else
return buf[pos++];
}
}
// 读取数据,并保存到字符数组b中从off开始的位置中,len是读取长度。
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 -;
}
if (pos + len > count) {
len = count - pos;
}
if (len <= 0) {
return 0;
}
System.arraycopy(buf, pos, b, off, len);
pos += len;
return len;
}
}
// 跳过n个字符
public long skip(long n) throws IOException {
synchronized (lock) {
ensureOpen();
if (pos + n > count) {
n = count - pos;
}
if (n < 0) {
return 0;
}
pos += n;
return n;
}
}
// 判断“是否能读取下一个字符”。能的话,返回true。
public boolean ready() throws IOException {
synchronized (lock) {
ensureOpen();
return (count - pos) > ;
}
}
public boolean markSupported() {
return true;
}
// 保存当前位置。readAheadLimit在此处没有任何实际意义
// mark()必须和reset()配合使用才有意义!
public void mark(int readAheadLimit) throws IOException {
synchronized (lock) {
ensureOpen();
markedPos = pos;
}
}
// 重置“下一个读取位置”为“mark所标记的位置”
public void reset() throws IOException {
synchronized (lock) {
ensureOpen();
pos = markedPos;
}
}
public void close() {
buf = null;
}
}
说明:
CharArrayReader实际上是通过“字符数组”去保存数据。
(01) 通过 CharArrayReader(char[] buf) 或 CharArrayReader(char[] buf, int offset, int length) ,我们可以根据buf数组来创建CharArrayReader对象。
(02) read()的作用是从CharArrayReader中“读取下一个字符”。
(03) read(char[] buffer, int offset, int len)的作用是从CharArrayReader读取字符数据,并写入到字符数组buffer中。offset是将字符写入到buffer的起始位置,len是写入的字符的长度。
(04) markSupported()是判断CharArrayReader是否支持“标记功能”。它始终返回true。
(05) mark(int readlimit)的作用是记录标记位置。记录标记位置之后,某一时刻调用reset()则将“CharArrayReader下一个被读取的位置”重置到“mark(int readlimit)所标记的位置”;也就是说,reset()之后再读取CharArrayReader时,是从mark(int readlimit)所标记的位置开始读取。
示例代码
关于CharArrayReader中API的详细用法,参考示例代码(CharArrayReaderTest.java):
/**
* CharArrayReader 演示程序
*
*
*/
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.IOException;
public class CharArrayReaderTest {
private static final int LEN = 5;
// 对应英文字母“abcdefghijklmnopqrstuvwxyz”
private static final char[] ArrayLetters = new char[] {'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'};
public static void main(String[] args) {
tesCharArrayReader() ;
}
/**
* CharArrayReader的API测试函数
*/
private static void tesCharArrayReader() {
try {
// 创建CharArrayReader字符流,内容是ArrayLetters数组
CharArrayReader car = new CharArrayReader(ArrayLetters);
// 从字符数组流中读取5个字符
for (int i=; i<LEN; i++) {
// 若能继续读取下一个字符,则读取下一个字符
if (car.ready() == true) {
// 读取“字符流的下一个字符”
char tmp = (char)car.read();
System.out.printf("%d : %c\n", i, tmp);
}
}
// 若“该字符流”不支持标记功能,则直接退出
if (!car.markSupported()) {
System.out.println("make not supported!");
return ;
}
// 标记“字符流中下一个被读取的位置”。即--标记“f”,因为因为前面已经读取了5个字符,所以下一个被读取的位置是第6个字符”
// (01), CharArrayReader类的mark(0)函数中的“参数0”是没有实际意义的。
// (02), mark()与reset()是配套的,reset()会将“字符流中下一个被读取的位置”重置为“mark()中所保存的位置”
car.mark(0);
// 跳过5个字符。跳过5个字符后,字符流中下一个被读取的值应该是“k”。
car.skip(5);
// 从字符流中读取个数据。即读取“klmno”
char[] buf = new char[LEN];
car.read(buf, 0, LEN);
System.out.printf("buf=%s\n", String.valueOf(buf));
// 重置“字符流”:即,将“字符流中下一个被读取的位置”重置到“mark()所标记的位置”,即f。
car.reset();
// 从“重置后的字符流”中读取5个字符到buf中。即读取“fghij”
car.read(buf, 0, LEN);
System.out.printf("buf=%s\n", String.valueOf(buf));
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
0 : a 1 : b 2 : c 3 : d 4 : e buf=klmno buf=fghij
以上所述是小编给大家介绍的Java 中的CharArrayReader知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# java
# chararrayreader
# Java的字符读写类CharArrayReader和CharArrayWriter使用示例
# Java基础知识之ByteArrayOutputStream流的使用
# Java基础知识之StringWriter流的使用
# Java IO流—异常及捕获异常处理 try…catch…finally
# Java IO流之StringWriter和StringReader用法分析
# Java基础知识之StringReader流的使用
# Java基础知识之CharArrayReader流的使用
# 是从
# 跳过
# 小编
# 实际意义
# 的是
# 在此
# 没有任何
# 下一
# 才有
# 给大家
# 然后再
# 为其
# 不支持
# 可以根据
# 会将
# 所述
# 是否能
# 若能
# 给我留言
# 感谢大家
相关文章:
宝塔Windows建站如何避免显示默认IIS页面?
建站之星各版本价格是多少?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何在IIS中配置站点IP、端口及主机头?
如何通过网站建站时间优化SEO与用户体验?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
怀化网站制作公司,怀化新生儿上户网上办理流程?
黑客入侵网站服务器的常见手法有哪些?
如何在万网主机上快速搭建网站?
如何通过建站之星自助学习解决操作问题?
建站之星如何防范黑客攻击与数据泄露?
音响网站制作视频教程,隆霸音响官方网站?
西安大型网站制作公司,西安招聘网站最好的是哪个?
建站为何优先选择香港服务器?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何用美橙互联一键搭建多站合一网站?
C#如何使用XPathNavigator高效查询XML
建站之星如何修改网站生成路径?
建站之星logo尺寸如何设置最合适?
网站制作模板下载什么软件,ppt模板免费下载网站?
网站企业制作流程,用什么语言做企业网站比较好?
测试制作网站有哪些,测试性取向的权威测试或者网站?
建站之星后台管理系统如何操作?
如何用低价快速搭建高质量网站?
宝塔建站后网页无法访问如何解决?
如何快速生成高效建站系统源代码?
高端网站建设与定制开发一站式解决方案 中企动力
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何快速生成ASP一键建站模板并优化安全性?
建站之星备案流程有哪些注意事项?
如何在阿里云服务器自主搭建网站?
Bpmn 2.0的XML文件怎么画流程图
如何高效生成建站之星成品网站源码?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
如何通过WDCP绑定主域名及创建子域名站点?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
,交易猫的商品怎么发布到网站上去?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
如何在万网自助建站平台快速创建网站?
如何在IIS管理器中快速创建并配置网站?
如何选择适合PHP云建站的开源框架?
网站专业制作公司有哪些,做一个公司网站要多少钱?
建站主机无法访问?如何排查域名与服务器问题
建站之星24小时客服电话如何获取?
定制建站哪家更专业可靠?推荐榜单揭晓
公司网站制作需要多少钱,找人做公司网站需要多少钱?
招贴海报怎么做,什么是海报招贴?
制作公司内部网站有哪些,内网如何建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。