IO流之字符流

字符流产生的原因:

1.每次只能够读取一个字节或者一个字节数组,每次在需要转换成字符或者字符串的时候不是很方便
2.不同的操作系统针对换行符的处理不方便
3.有的时候会出现中文乱码(中文占两个字节,如果针对中文中某个字节做了转换或者显示,就会出现乱码)
4.如果需要读取某一行数据,非常不方便

编码

* String/char[] --> byte[]
* 解码
* byte[] --> String/char[]


我们可以对字符数组或者字符串进行编码,那么其实IO流底层是字符流或者字节流,所以我们一样可以对流的数据进行编码和解码


转换流

需求:使用字符流向文本里写入“HelloWorld”。
Writer(抽象类,不能直接使用,选择子类)
OutputStreamWriter(转换流,是字节流通向字符流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认字符集编码。)
构造方法
OutputStreamWriter(OutputStream out) 创建使用默认字符编码的字符输出转换流
OutputStreamWriter(OutputStream out, Charset cs) 创建使用cs字符集的字符输出转换流
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使用enc字符集编码器的
OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的

转换流的核心功能在于将字节流转换成字符流,这样就能够使用更多好的方法来处理文本文件

FileWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个OutputStreamWriter。
FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
  构造方法类似FileInputStream和FileOutputStream
  成员方法完全继承自父类OutputStreamWriter和InputStreamReader

高效字符流
  类似于字节流的BufferedOutputStream和BufferedInputStream,字符流同样存在字符缓冲流
  同理,字符缓冲流也是为了提高字符流的效率。
  BufferedWriter和BufferedReader继承自Writer和Reader,所以具备原有的读取方法,但是还存在自己特有的方法。
  特有的方法:
    BufferedWriter:void newLine()
    BufferedReader:String readLine()

原文地址:https://www.cnblogs.com/lrxvx/p/9412289.html