【java I/O流总结】其它字符流零散总结

前面几个IO流相关博客总结了几个比较重要的类,还剩下几个,类源码非常易懂。这里简单总结一下我记录的要点。

CharArrayReader&CharArrayWriter

1. CharArrayReader
  • 看了源码,感觉没什么作用,CharArrayReader大概就是遍历一个输入的char[] (可以从头开始也可以设offset),输出char或者char[]片段,相当于从输入的char中读取出来字符或者字符数组。
2. CharArrayWriter
  • CharArrayWriter就是往一个实例域char[] (buf)中写入数据,可以写入码点值、char[]和String;
  • 构造函数可以指定buf大小,默认是32;
  • writeTo(Writer out) 方法,可以将buf输入到另一个字符输出流;
  • 跟PrintWriter一样有很多append方法;
  • toCharArray()和toString()方法,可以通过返回值获取到buf。其中经历了复制,剔除了数组空项。

IO流类源码中多处用到了字符串拷贝方法,我发现以下两个方法都被用到

System.arraycopy()和Arrays.copyOf()的区别

  • arraycopy()需要目标数组,将原数组拷贝到你自己定义的数组里,而且可以选择拷贝的起点和长度以及放入新数组中的位置;
  • copyOf()是系统自动在内部新建一个数组,调用arraycopy()将original内容复制到copy中去,并且长度为newLength。返回copy; 即将原数组拷贝到一个长度为newLength的新数组中,并返回该数组。适用于数组扩容或者缩减。

StringWriter&StringReader

  • StringWriter和StringReader跟上面CharArray如出一辙,只不过写入写出的是String
  • 注意由于String是定长类型,StringWriter中维护一个StringBuffer对象(构造时可以指定长度),可以通过getBuffer()直接获取,也可以通过toString获得String;貌似不能转化为char[]输出出来;
  • StringReader读取只能读出来一个字符或者一个字符数组,不能String;

个人感觉,实践中,这些字符串输入输出方法,reader用在从一个String或char[]遍历获取数据,writer用在通过不同来源拼接一个String 或char[]。没什么大用

管道流

  • PipedWriter中有一个实例域引用对应的PipedReader对象,但是PipedReader不引用它;
  • 写数据时,PipedWriter中的write调用PipedReader的方法receive将数据写入PipedReader中的缓冲区实例域,read再从缓冲区读取;应该是这样。
  • 感觉可以用于线程间通信,找机会也详细总结一波。

StreamEncoder和StreamDecoder

  • 使用inputStreamReader和outputStreamWriter必须要调用它们;
  • 它们会对数据进行字符——字节、字节——字符的转化,最终的读写操作还是调用字节流中的native方法来读写;
  • 字节流中默认没有缓冲区,但是它们提供了字节缓冲区。

字节流的内容很多都跟前面学习过的字符流大同小异,如FileInputStream、BufferInputStream等等,总的看下来,字符流相当于是在字节流基础上做的进一步封装。当然也有少数独特的,如SequenceInputStream,这个后面有时间再填一下坑。

原文地址:https://www.cnblogs.com/buptleida/p/12625827.html