IO流(四)高级流——>转换流
(2)转换流
—1、转换流基本用法
转换流
是字符流的子类,是字符流和字节流之间的桥梁,创建转换流对象(InputStreamReader)会包装一个字节流,转换流可以让该字节流变成字符流,让它拥有字符流的特性。比如:可以根据字符集一次读取多个字节,读取数据不会乱码了。而当要拷贝到文件时,创建OutputStremWriter会将字符流再次转换为字节流存入文件。
注:转换流InputStreamReader的父类是Reader,而关键:FileReader字符输入流的父类是转换流,同理输出流也一样
转换流的应用场景
1、指定字符集读写
2、字节流想要使用字符流中的方法
转换流构造方法
//构造1:默认平台编码InputStreamReader(InputStream in)
//构造2:指定编码【重点】InputStreamReader(InputStream in, String charsetName)
底层原理:
—2、转换流练习
(1)将本地文件中的GBK文件,转成UTF-8
JDK11以前必须创建转换流对象,利用转换流指定字符编码读写InputStreamReader isr = new InputStreamReader(new FileInputStream("opp-IO\\Text.txt"),"GBK");这是非常麻烦的,所
而在JDK11以后出现了替代方法
FileReader字符输入流的父类是转换流InputStreamReader,而InputStreamReader在JDK11出现了新的构造方法public InputStreamReader(File file, Charset charset)该方法的第二个参数调用Charset里面的静态方法forName是用来指定字符编码的所以转换流的子类FileReader继承子类构造方法,也可以用这种构造方法
所以要转换本地文件编码类型,不用在创建转换流对象,
FileWriter fw = new FileWriter("opp-IO\\c.txt", Charset.forName("GBK"));
package ConvertStream; import java.io.*; import java.nio.charset.Charset; public class ConvertStreamDemo1 { public static void main(String[] args) throws IOException { /* 利用转换流按照指定字符编码读取(了解即可) 因为有替代方法JDK11以后 */ //1.创建对象并指定字符编码 // InputStreamReader isr = new InputStreamReader(new FileInputStream("opp-IO\\Text.txt"),"GBK"); // //2.读取数据 // int ch; // while ((ch = isr.read()) != -1) { // System.out.print((char)ch); // } // isr.close(); /* JDK11以后得替代方法 FileReader字符输入流的父类是转换流InputStreamReader, 而InputStreamReader在JDK11出现了新的构造方法 public InputStreamReader(File file, Charset charset) 该方法的第二个参数调用Charset里面的静态方法forName是用来指定字符编码的 所以转换流的子类FileReader继承子类构造方法,也可以用这种构造方法 */ FileReader fr = new FileReader("opp-IO\\Text.txt", Charset.forName("GBK")); int ch; while ((ch = fr.read()) != -1) { System.out.print((char)ch); } fr.close(); /* 利用转换流按照指定字符编码写出(旧的方法了解即可) 因为有替代方法 */ // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("opp-IO\\c.txt"),"GBK"); // osw.write("我是帅哥"); // osw.close(); FileWriter fw = new FileWriter("opp-IO\\c.txt", Charset.forName("GBK")); fw.write("我是帅哥"); fw.close(); } }最终代码
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.charset.Charset; public class ConvertStreamDemo2 { public static void main(String[] args) throws IOException { /* 将本地文件中的GBK文件,转成UTF-8; */ FileReader fr = new FileReader("opp-IO\\Text.txt", Charset.forName("GBK")); FileWriter fw = new FileWriter("opp-IO\\c.txt", Charset.forName("UTF-8")); int len; char[] chars = new char[1024]; while((len = fr.read(chars)) != -1) { fw.write(chars, 0, len); } fw.close(); fr.close(); } }(2)用字节流读取文件数据(不能出现乱码)
利用字节流读取文件中的数据,每次读一整行,而且不能出现乱码
//1、字节流在读取中文的时候,是会出现乱码的,但是字符流可以搞定
//2、字节流里面是没有读一整行的方法的,只有字符缓冲流才能搞定
此时可以利用转换流将字节流转成字符流
InputStreamReader(字节输入流,"编码")
OutputStreamWriter(字节输出流,"编码")
转换流 = 字节流 + 编码参数
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class ConvertStreamDemo3{ public static void main(String[] args) throws IOException { /* 利用字节流读取文件中的数据,每次读一整行,而且不能出现乱码 //1、字节流在读取中文的时候,是会出现乱码的,但是字符流可以搞定 //2、字节流里面是没有读一整行的方法的,只有字符缓冲流才能搞定 */ /*FileInputStream fis = new FileInputStream("opp-IO\\a.txt"); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); String str = br.readLine(); System.out.println(str); br.close(); */ BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("opp-IO\\a.txt"))); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); } }