编码转换流
字节流:针对二进制文件
字符流:针对文本文件,读写容易出现乱码的现象,在读写时,最好指定编码集为UTF-8
1 概述
编码转换流(InputStreamReader/OutputStreamWriter)主要进行编码的转换,用来解决字符流读写乱码的问题
2 工具API学习
OutputStreamWriter :
OutputStreamWriter(OutputStream out)把传入的字节流转成字符流
OutputStreamWriter(OutputStream out ,String charsetName)把Unicode转成其他编码输出
InputStreamReader :
InputStreamReader(InputStream in) 把传入的字节流转成字符流
InputStreamReader(InputStream in,String charsetName)读取其他编码转成Unicode
3 常见字符编码表
4 练习:编码转换测试
package cn.encoding;
import java.io.*;
/* 本类用于测试编码转换流*/
public class TestEncode {
public static void main(String[] args) {
method1(); //用于测试OutputStreamWriter
method2(); //用于测试InputStreamWriter
}
private static void method2() {
//1.创建一个在本方法中都生效的局部变量,并给变量初始化
InputStreamReader in = null;
//2.由于代码可能会产IO异常,所以需要完成try-catch-finally结构
try{
//3.创建针对输入流对象,并定义编码表
in = new InputStreamReader(
new FileInputStream ("1.txt"),"utf-8");
//new FileInputStream ("1.txt"),"iso-8859-1");
//new FileInputStream ("1.txt"),"gbk");
// System.out.println(in.read());; //读取的数据可以打印查看 ==1==
//将刚刚读到的数据,以中文的形式展示在控制台
char [ ] ch = new char[8192];
//Reader中的方法:read(char[] cbuf)将字符读入数组,返回读取到的字符的个数
int len = in.read(ch);
//此处是String的构造函数,利用ch数组中的数据,构建一个字符串,并打印到控制台
System.out.println(new String(ch,0,len));
//因为read没执行一次就读取一个字符,因为==1==的原因,输出结果是少一个字,将其注释
System.out.println("读取成功,已打印");
}catch(Exception e){
System.out.println("读取失败");
e.printStackTrace();
}finally {
try {
//5.关流
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void method1() {
//1.创建一个在本方法中都生效的局部变量,并给变量初始化
OutputStreamWriter out = null;
//2.由于代码可能会产IO异常,所以需要完成try-catch-finally结构
try{
//3.创建针对输出流对象,并定义编码表
out = new OutputStreamWriter(
new FileOutputStream("1.txt"),"utf-8");
//new FileOutputStream("1.txt"),"iso-8859-1");
//new FileOutputStream("1.txt"),"gbk");
//4.使用流对象写出数据
out.write("海绵宝宝与派大星");
System.out.println("执行成功");
}catch(Exception e){
System.out.println("执行失败");
e.printStackTrace();
}finally {
//关流
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}