文章目录
1. 概念
CharArrayWriter和CharArrayReader分别是字符数组输出流和字符数组输入流,与ByteInputStream和ByteOutputStream字节数组流相比,前者是缓冲区里面存储的是字符,而字节数组里面存储是字节.
- CharArrayWriter:字符数组输出流里面有一字符数组(缓冲区),写入字符数组流的数据会存储在此字符数组中,如果字符数据超过了缓冲区的大小,就会扩容.写入流里面的数据可以通过调用方法toString()或者toCharArray()方法查看.
- CharArrayReader:字符数组输入流里面有一字符数组(缓冲区),通过有参构造方法将字符数据写入缓冲区,通过调用方法可以读取到缓冲区指定位置的数据
注意:字符数组输入流和输出流,不是从文件读取和写入到文件的流,字符数组输出流中存在缓冲区,通过调用write()或者append()方法向缓冲区中写入字符数据,当数据超过缓冲区时,会扩容
2. 字段
1. CharArrayWriter
- protected char buf[]:字符数组输出流中的缓冲区
- protected int count:缓冲区中有效字符的大小
2. CharArrayReader
- protected char buf[]:字符数组输入流中的缓冲区
- protected int pos:流中当前位置
- protected int markedPos = 0:标记位置,调用mark()方法会将当前位置保存到markPos位置,调用reset()方法会将当前重置到markpos位置
- protected int count:缓冲区结尾的索引值
3. 方法
1. 构造器
1. CharArrayWriter
- public CharArrayWriter():创建缓冲区为默认的32个字符
- public CharArrayWriter(int initialSize):创建指定大小initialSize的缓冲区
2. CharArrayReader
- public CharArrayReader(char buf[]):创建指定缓冲区的字符数组输入流
- public CharArrayReader(char buf[], int offset, int length):创建指定缓冲区的字符数组输入流.(会将流中位置和标记的位置都置为offset索引处)
2. 其他方法
1. CharArrayWriter
- public void write(int c):将字符c写到字符数组输出流中
- public void write(char c[], int off, int len):将字符数组c中off位置开始,len个字节写到字符数组输出流中
- public void write(String str, int off, int len):将字符串中,off位置开始,len个字符写到字符数组输出流中
- public void writeTo(Writer out) throws IOException:将缓冲区中的数据写到另外一个字符输出流中
- public CharArrayWriter append(CharSequence csq):将字符序列csq写到字符数组输出流中.并返回CharArrayWriter对象
- public CharArrayWriter append(CharSequence csq, int start, int end):将字符序列csq中start到end之间的字符写到数组数组输出流中.并返回CharArrayWriter对象
- public CharArrayWriter append(char c):将字符c添加到缓冲区中,并返回CharArrayWriter对象
- public void reset():清空缓冲区
- public char[] toCharArray():将缓冲区中数据复制字符数组中,并返回
- public int size():返回缓冲区的大小
- public String toString():将缓冲区里面的数据转换成字符串返回
2. CharArrayReader
- public int read():读取一个字符
- public int read(char b[], int off, int len):将流中最多读取len个字节到字节数组b中.位置从off开始
- public long skip(long n):缓冲区当前位置跳过n个字节,实际跳过的字节小于n
- public boolean ready():是否能读取下一个字节
- public boolean markSupported():是否支持标记
- public void mark(int readAheadLimit):标记缓冲区当前位置.保存当前位置索引
- public void reset():将流中当前位置重置到最后一次标记的位置
- public void close():关闭流,释放相关资源
4. 案例
public class CharArrayDemo {
public static void main(String[] args) throws IOException {
char[] letters = new char[] {'b','c','d','e','f','h','i','j'};
testCharArrayWriter(letters);
System.out.println("-----------------------------");
testCharArrayReader(letters);
}
//测试testCharArrayWriter
private static void testCharArrayWriter(char[] letters) throws IOException {
CharArrayWriter caw = new CharArrayWriter();
caw.write('a');
caw.write(letters,0,4);
caw.write("world", 1, 3);
caw.append('0').append("123").append("678910", 0, 2);
String result = caw.toString();
System.out.println("缓冲区数据转化成字符串---"+result);
char[] charArray = caw.toCharArray();
System.out.println("缓冲区数据---"+new String(charArray).toString());
CharArrayWriter anotherWriter = new CharArrayWriter();
caw.writeTo(anotherWriter);
System.out.println("字符数组anotherWriter的数据"+anotherWriter.toString());
}
//测试testCharArrayReader
private static void testCharArrayReader(char[] letters) throws IOException {
CharArrayReader car = new CharArrayReader(letters);
//下一个字节是否可读
if(car.ready()) {
System.out.println("单个字节---"+(char)car.read());
}
char[] letterChar = new char[10];
car.read(letterChar, 0, 3);
System.out.println("字符数组letterChar--"+String.valueOf(letterChar));
//mark(0),0不表示实际意义,mark的是当前位置
if(car.markSupported()) {
car.mark(0);
}
//跳过三个字节
car.skip(3);
System.out.println("此时位置----"+(char)car.read());
car.reset();
System.out.println("此时位置----"+(char)car.read());
}
}
//结果
缓冲区数据转化成字符串---abcdeorl012367
缓冲区数据---abcdeorl012367
字符数组anotherWriter的数据abcdeorl012367
-----------------------------
单个字节---b
字符数组letterChar--cde