1、writer
writer是一个抽象类,是所有输出字符流的子类,里面主要包含了write(),append(),flush()和close()方法,write和append的作用大致一样,因为append()方法里面调用write写字符的,唯一一点不同的是:1.append可以添加null的字符串,输出为"null"
2.而write会抛出空指针异常。
类里还将String字符串通过调用String.getChars()方法将字符串转化为char数组,同时还留下了一个write()接口来供继承他的子类使用
2、OutputStreamWriter
继承了Writer类,但是调用了nio包下的StreamEncoder类的方法来实现功能,构造方法传入的参数是OutPutStream实例和编码实例,所以底层还是字节流,只是增加了编码方法来将字节流转化为字符流。
3、FileWriter
继承了OutputStreamWriter,内部只有各种构造函数,并且所有构造函数都是使用super()来调用父类的方法来实现功能。
4、FilterWriter
继承了writer类,自身也是一个抽象类,FilterReader类有各种子类实现各种方法,而FilterWriter没有子类,同时内部实现的方法也都是调用父类Writer内的方法来实现的,可能只是目前留下这个接口,方便之后的调用增加新的子类功能。
5、BufferedWriter
创建BufferedWriter时,我们会通过它的构造函数指定某个底层字符输出流Writer为参数。当程序中每次将单个字符、数组和字符串写入到BufferedWriter中时、都会检查BufferedWriter中的缓存区是否存满,如果没有存满则将字符写入到缓存区中;如果存满,则调用底层的writer(char[] b, int off, int len)将缓存区中的所有字符一次性写入到底层Writer中。
6、CharArrayWriter
字符数组输出流、用于将字符写入到内置字符缓存数组char[] buf中、构造函数可以设定缓冲数组大小,当此数组存放满员时会调用Arrays.copyOf()自动扩容、同样与ByteArrayOutputStream相比他也提供了几个操作buf中字符的方法、可使用 toCharArray() 和 toString() 获取数据、还可使用writeTo(Writer out)将buf写入到底层流中。同样在此类上调用 close()、flush()无效,不会产生IOException、并且在关闭该流后仍然可以调用此类中的各个方法。
7、PipedWriter
PipedReader和PipedWriter与PipedInputStream和PipedOutputStream一样,都可以用于管道通信。PipedWriter是字符管道输出流,继承于Writer;PipedReader是字符管道输入流,继承于Reader,PipedWriter和PipedReader的作用是可以通过管道进行线程间的通讯。两者必须要配套使用。
8、StringWriter
StringWriter类内部维持了一个Stringbuffer,所有要输出的字符都保存在这个Stringbuffer里,但是并没有对外输出的功能,使用的时候只能打印在ide里,无法输出在文件内。
9、PrintWriter
PrintWriter提供了PrintStream的所有打印方法,其方法也从不抛出IOException。与PrintStream的区别:作为处理流使用时,PrintStream只能封装OutputStream类型的字节流,而PrintWriter既可以封装OutputStream类型的字节流,还能够封装Writer类型的字符输出流并增强其功能。
同时,2个类的功能基本相同,PrintStream能做的PrintWriter也都能实现,并且PrintWriter的功能更为强大。但是由于PrintWriter出现的比较晚,较早的System.out使用的是PrintStream来实现的,所以为了兼容就没有废弃PrintStream。
2个类最大的差别是,PrintStream在输出字符,将字符转换为字节时采用的是系统默认的编码格式,这样当数据传输另一个平台,而另一个平台使用另外一个编码格式解码时就会出现问题,存在不可控因素。PrintWriter在传参数时可由程序员指定字符转换为字节时的编码格式,这样兼容性和可控性会更好。