Java IO (10) -- CharArrayWriter 类 & CharArrayReader 类

1. 概念

CharArrayWriter和CharArrayReader分别是字符数组输出流和字符数组输入流,与ByteInputStream和ByteOutputStream字节数组流相比,前者是缓冲区里面存储的是字符,而字节数组里面存储是字节.

  1. CharArrayWriter:字符数组输出流里面有一字符数组(缓冲区),写入字符数组流的数据会存储在此字符数组中,如果字符数据超过了缓冲区的大小,就会扩容.写入流里面的数据可以通过调用方法toString()或者toCharArray()方法查看.
  2. CharArrayReader:字符数组输入流里面有一字符数组(缓冲区),通过有参构造方法将字符数据写入缓冲区,通过调用方法可以读取到缓冲区指定位置的数据

注意:字符数组输入流和输出流,不是从文件读取和写入到文件的流,字符数组输出流中存在缓冲区,通过调用write()或者append()方法向缓冲区中写入字符数据,当数据超过缓冲区时,会扩容

2. 字段

1. CharArrayWriter

  1. protected char buf[]:字符数组输出流中的缓冲区
  2. protected int count:缓冲区中有效字符的大小

2. CharArrayReader

  1. protected char buf[]:字符数组输入流中的缓冲区
  2. protected int pos:流中当前位置
  3. protected int markedPos = 0:标记位置,调用mark()方法会将当前位置保存到markPos位置,调用reset()方法会将当前重置到markpos位置
  4. protected int count:缓冲区结尾的索引值

3. 方法

1. 构造器

1. CharArrayWriter
  1. public CharArrayWriter():创建缓冲区为默认的32个字符
  2. public CharArrayWriter(int initialSize):创建指定大小initialSize的缓冲区
2. CharArrayReader
  1. public CharArrayReader(char buf[]):创建指定缓冲区的字符数组输入流
  2. public CharArrayReader(char buf[], int offset, int length):创建指定缓冲区的字符数组输入流.(会将流中位置和标记的位置都置为offset索引处)

2. 其他方法

1. CharArrayWriter
  1. public void write(int c):将字符c写到字符数组输出流中
  2. public void write(char c[], int off, int len):将字符数组c中off位置开始,len个字节写到字符数组输出流中
  3. public void write(String str, int off, int len):将字符串中,off位置开始,len个字符写到字符数组输出流中
  4. public void writeTo(Writer out) throws IOException:将缓冲区中的数据写到另外一个字符输出流中
  5. public CharArrayWriter append(CharSequence csq):将字符序列csq写到字符数组输出流中.并返回CharArrayWriter对象
  6. public CharArrayWriter append(CharSequence csq, int start, int end):将字符序列csq中start到end之间的字符写到数组数组输出流中.并返回CharArrayWriter对象
  7. public CharArrayWriter append(char c):将字符c添加到缓冲区中,并返回CharArrayWriter对象
  8. public void reset():清空缓冲区
  9. public char[] toCharArray():将缓冲区中数据复制字符数组中,并返回
  10. public int size():返回缓冲区的大小
  11. public String toString():将缓冲区里面的数据转换成字符串返回
2. CharArrayReader
  1. public int read():读取一个字符
  2. public int read(char b[], int off, int len):将流中最多读取len个字节到字节数组b中.位置从off开始
  3. public long skip(long n):缓冲区当前位置跳过n个字节,实际跳过的字节小于n
  4. public boolean ready():是否能读取下一个字节
  5. public boolean markSupported():是否支持标记
  6. public void mark(int readAheadLimit):标记缓冲区当前位置.保存当前位置索引
  7. public void reset():将流中当前位置重置到最后一次标记的位置
  8. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值