概述
字符编码
计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制
数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照
某种规则解析显示出来,称为解码 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本f符
号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。
文件一定是以字节的形式保存在计算机中的。。
程序写入文件的过程,反之亦然
InputStreamReader类
概念
转换流 java.io.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
构造方法
- InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。
- InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流。
由于本地的文件有可能是不同字符集的,所以读出的时候有可能出现乱码,如下实例,程序读取一个GBK字符集的文本,程序默认以UTF-8解码,所以无法输出真确结果
public class Demo {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("Demo//GBK.txt"));
int read = 0;
while ((read = isr.read()) !=-1) {
System.out.print((char) read);
}
isr.close();
}
}
GBK.txt内容:gbk2个中文用4个字节表示
控制台输出结果:
由于用utf-8解码了gbk所以出现乱码
用InputStreamReader指定字符集解码
public class Demo {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("Demo//GBK.txt"),"gbk");
int read = 0;
while ((read = isr.read()) !=-1) {
System.out.print((char) read);
}
isr.close();
}
}
输出正常结果:因为用了gbk字符集解码gbk,所以输出结果正确。
OutputStreamWriter类
转换流 java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
构造方法
- OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
- OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流。
用OutputStreamWriter写入GBK字符到GBK.txt中,并用InputStreamReader解码打印
package WriteAndreader;
import java.io.*;
public class Demo {
public static void main(String[] args) throws IOException {
//创建输出和输入的转换流对象,指定GBK.txt文件,用GBK格式写入,再用GBK格式读出
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("Demo//GBK.txt"), "GBK");
InputStreamReader isr = new InputStreamReader(new FileInputStream("Demo//GBK.txt"), "GBK");
//写入数据,用flush刷新
String str = "转换流测试专用";
osw.write(str);
osw.flush();
//去除文件内的内容,遍历打印
int len;
while ((len = isr.read()) != -1) {
System.out.println((char)len);
}
//记得释放资源
isr.close();
osw.close();
}
}
输出正确的结果:
以上案例以及证明了这两个类具有编码和解码的功能,这就是转换流类,
下期讲序列化流