IO流(四)高级流——>转换流
2转换流—1、转换流基本用法转换流是字符流的子类是字符流和字节流之间的桥梁创建转换流对象InputStreamReader会包装一个字节流转换流可以让该字节流变成字符流让它拥有字符流的特性。比如可以根据字符集一次读取多个字节读取数据不会乱码了。而当要拷贝到文件时创建OutputStremWriter会将字符流再次转换为字节流存入文件。注转换流InputStreamReader的父类是Reader,而关键FileReader字符输入流的父类是转换流同理输出流也一样转换流的应用场景1、指定字符集读写2、字节流想要使用字符流中的方法转换流构造方法//构造1默认平台编码InputStreamReader(InputStream in)//构造2指定编码【重点】InputStreamReader(InputStream in, String charsetName)底层原理—2、转换流练习1将本地文件中的GBK文件转成UTF-8JDK11以前必须创建转换流对象利用转换流指定字符编码读写InputStreamReader isr new InputStreamReader(new FileInputStream(opp-IO\\Text.txt),GBK);这是非常麻烦的所而在JDK11以后出现了替代方法FileReader字符输入流的父类是转换流InputStreamReader,而InputStreamReader在JDK11出现了新的构造方法public InputStreamReaderFile 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 InputStreamReaderFile 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(); } }

相关新闻