转换流
转换流包括字符编码和字符集
字符编码和字符集
字符编码是计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数
转换之后的结果,按照某种规则,将字符储存到计算机中,称为编码,放置,将存储在计算机中的二进制数按照某种规则
解析显示出来,称为解码,比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号,反之,按照A规则存储
,在按照B规则解析,就会导致乱码现象
编码:字符->字节
解码:字节->字符
字符编码:就是一套自然语言的字符与二进制之间的对应规则
编码表:生活中文字和计算机中二进制的对应规则
字符集:也叫编码表,是一个系统支持的所有字符的集合,包裹各国家文字、标点符号、图形符号、数字等
计算机要准确的储存和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有
ASCII字符集,GBK字符集,Unicode字符集等
编码引出的问题
在一些软件中编码与windows系统的默认编码不是同一编码就会出现乱码问题
在windows系统中默认的编码是GBK编码,在IDEA中默认使用的是UTF-8编码所以就会出现乱码问题
解决乱码问题
就需要用到转换流InputStreamReader与OutStreamWriter,因为
FileReader只能查询默认码表,如果文件格式与编译器默认的编码不一样,那么就会出现乱码问题
OutStreamWriter
/* java.io.OutStreamWriter extends Writer OutStreamWriter:是字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节, 继承自父类的共性成员方法: void write(int c)写入单个字符 void write(char[] chuf)写入字符数组 abstract void write(char[] chuf,int off,int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数 void write(String str)写入字符串 void write(String str, int off, int len)写入字符串的某一部分,off字符串的开始索引,len写的字符个数 void flush()刷新该流的模块 void close()关闭此流,但要先刷新 构造方法: OutStreamWriter(OutputStream out) 创建使用默认字符编码的 OutStreamWriter OutStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutStreamWriter 参数: OutputStream out:字节输出流,可以用来写转换之后的字节到文件中 String charsetName:指定的编码表名称,不区分大小写 使用步骤: 创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称 使用OutputStreamWriter对象中的方法Write,把字符转换为字节存储到缓冲区中 使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中 资源释放 */ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class OutputStreamWrite { public static void main(String[] args) throws IOException{ write_utf_8(); } /* 使用转换流写utf-8格式的文件 */ private static void write_utf_8() throws IOException{ OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("1.txt"),"utf-8"); osw.write("你好"); osw.flush(); osw.close(); } }
InputStreamRead
/* InputStreamReader java.io.InputStreamReader extends Reader InputStreamReader 是字节流通向字符流的桥梁,他使用指定的charset读取字节并将其编码为字符 继承自父类的共性方法: int read()读取单个字节并返回 int read(char[] chuf)一次读取多个字符,将字符读入数组 void close() 关闭该流并释放与之相关的所有资源 构造方法 InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader InputStreamReader(InputStream in,String charsetName) 创建使用指定字符集的 InputStreamReader 参数: InputStream in: 字节输入流,用来读取文件中保存的字节 String charsetName:指定的编码表名称,不区分大小写 使用步骤 创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称 使用InputStreamReader对象中的方法read读取文件 释放资源 注意事项 构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码 */ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class DemoInputStreamRead { public static void main(String[] args) throws IOException{ read_utf_8(); } private static void read_utf_8() throws IOException{ InputStreamReader isr = new InputStreamReader(new FileInputStream("1.txt"),"utf-8"); int len = 0; while((len = isr.read())!=-1){ System.out.println((char)len); } isr.close(); } }