转换流[字节流<-->字符流]
以指定的格式读取文件,最好是文件的本身的格式, 然后以自己需要的格式写出,来达成转码的需求
字符编码:
按照某种规则,将字符存储到计算机中,称为编码;反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码
-
字符编码:就是一套自然语言中的字符与二进制数之间的对应规则.
字符集:
字符集:是一个系统可支持的所有字符的集合,包含各国文字,标点符号,图形符号,数字等.也叫编码表.
计算机中要准确的存储和识别各种文字的字符符号,需要进行字符编码,一套字符集至少有一套字符编码
常见的字符编码集有ASCII字符集,GBK字符集.Unicode字符集
ASCII字符集:
-
ASCII是基于拉丁字母的一套电脑编码系统
-
基本的ASCII字符集,使用7位(bit)表示一个字符,共128个字符.ASCII的扩展字符集使用8位(bit)表示一个字符,共256个字符.
ISO-8859-1字符集:
拉丁码表,别名Latin-1,用于显示欧洲使用的语言,包括荷兰,单买,德语,意大利语,西班牙等.
ISO-8859-1适用单字节编码,兼容ASCII编码.
GB字符集
-
GB2312:简体中文码表,里面大概含有7000多个简体汉字,此外数学符号,罗马希腊的字母.日本的假名都编进去了,连在ASCII里的原来就有的数字.标点,字母都统统重新编写进去了,
-
GBK:最常用的中文编码.是在原来GB2312码表基础上进行扩展,使用双字节编码.共收录了,共收录了21000多个汉字,完全兼容GB2312,标准,同时支持繁体汉字以及日韩汉字等.
-
GB18030:最新的中文码表,共收录了70000多个汉字,采用多字节编码,每个字可以由1个字节,2个字节或者4个字节组成,支持国内少数民族的文字.同时支持繁体字以及日韩汉字等.
Unicode字符集:
-
Unicode编码系统为表达任意语言的任意字符而设计的,是业界的一种标准,也成为了统一编码,标准万国码表
-
它最多使用4个字节的数字来表示每个字母.符号.或者文字.有三种常见的编码方案:UTF-8,UTF-16,UTF-32.
-
UTF-8编码表,用来表示Unicode标准中的任意字符,编码规则:
1.128个US-ASCII字符,使用的是一个字节编码
2.拉丁子的字母,需要两个字节编码
3.大部分常见的汉字,使用的是三个字节编码
4.其他极少数的辅助字符,采用的四个字节编码
编码会引发的问题
由于编码规则不一致,导致引发乱码现象.
那么如何读取GBK编码的文件呢
InputStreamReader类
转换流 java.io.inputStreamReader.是Reader的子类,它是从字节流到字符流的桥梁,它读取字节并使用指定的字符集将其解码为字符.它的字符集可以由名称指定,或者可以使用平台默认的字符集.
构造方法
-
public inputStreamReader(inputStream in):创建一个使用默认的字符集的字符流.
-
public inputStreamReader(inputStream in,String charsetName):创建一个指定字符集的字符流
OutputStreamWriter类
转换流java.io.OutputStreamWriter是Writer的子类,它是字符流到字节流的桥梁.使用指定的字符集将字符编码为字节.它的字符集可以手动指定,特可以使用平台默认的字符集.
构造方法
-
public OutputStreamWriter(OutputStream out):创建一个使用平台默认的字符集的字符流.
-
public OutputStreamWriter(OutputStream out,String charsetName):创建一个指定的字符集的字符流.
-
转换流[字节流<-->字符流]
字符编码:
按照某种规则,将字符存储到计算机中,称为编码;反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码
-
字符编码:就是一套自然语言中的字符与二进制数之间的对应规则.
字符集:
字符集:是一个系统可支持的所有字符的集合,包含各国文字,标点符号,图形符号,数字等.也叫编码表.
计算机中要准确的存储和识别各种文字的字符符号,需要进行字符编码,一套字符集至少有一套字符编码
常见的字符编码集有ASCII字符集,GBK字符集.Unicode字符集
ASCII字符集:
-
ASCII是基于拉丁字母的一套电脑编码系统
-
基本的ASCII字符集,使用7位(bit)表示一个字符,共128个字符.ASCII的扩展字符集使用8位(bit)表示一个字符,共256个字符.
ISO-8859-1字符集:
拉丁码表,别名Latin-1,用于显示欧洲使用的语言,包括荷兰,单买,德语,意大利语,西班牙等.
ISO-8859-1适用单字节编码,兼容ASCII编码.
GB字符集
-
GB2312:简体中文码表,里面大概含有7000多个简体汉字,此外数学符号,罗马希腊的字母.日本的假名都编进去了,连在ASCII里的原来就有的数字.标点,字母都统统重新编写进去了,
-
GBK:最常用的中文编码.是在原来GB2312码表基础上进行扩展,使用双字节编码.共收录了,共收录了21000多个汉字,完全兼容GB2312,标准,同时支持繁体汉字以及日韩汉字等.
-
GB18030:最新的中文码表,共收录了70000多个汉字,采用多字节编码,每个字可以由1个字节,2个字节或者4个字节组成,支持国内少数民族的文字.同时支持繁体字以及日韩汉字等.
Unicode字符集:
-
Unicode编码系统为表达任意语言的任意字符而设计的,是业界的一种标准,也成为了统一编码,标准万国码表
-
它最多使用4个字节的数字来表示每个字母.符号.或者文字.有三种常见的编码方案:UTF-8,UTF-16,UTF-32.
-
UTF-8编码表,用来表示Unicode标准中的任意字符,编码规则:
1.128个US-ASCII字符,使用的是一个字节编码
2.拉丁子的字母,需要两个字节编码
3.大部分常见的汉字,使用的是三个字节编码
4.其他极少数的辅助字符,采用的四个字节编码
编码会引发的问题
由于编码规则不一致,导致引发乱码现象.
那么如何读取GBK编码的文件呢
InputStreamReader类
转换流 java.io.inputStreamReader.是Reader的子类,它是从字节流到字符流的桥梁,它读取字节并使用指定的字符集将其解码为字符.它的字符集可以由名称指定,或者可以使用平台默认的字符集.
构造方法
-
public inputStreamReader(inputStream in):创建一个使用默认的字符集的字符流.
-
public inputStreamReader(inputStream in,String charsetName):创建一个指定字符集的字符流
OutputStreamWriter类
转换流java.io.OutputStreamWriter是Writer的子类,它是字符流到字节流的桥梁.使用指定的字符集将字符编码为字节.它的字符集可以手动指定,特可以使用平台默认的字符集.
-
构造方法
-
public OutputStreamWriter(OutputStream out):创建一个使用平台默认的字符集的字符流.
-
public OutputStreamWriter(OutputStream out,String charsetName):创建一个指定的字符集的字符流.
练习:转换文件的编码
将GBK编码的文本文件,转换为UTF-8编码的文件.
1.指定GBK编码的转换流,读取文本文件.inputStreamReader
2.使用UTF-8编码的转换流,写入到新文本文件中 OutputStreamWriter
//1.1指定GBK编码的转换流,读取文本文件.inputStreamReader
InputStreamReader bgk = new InputStreamReader(new FileInputStream(new File("day30-IO\GBK.txt")), "gbk");
//1.22.使用UTF-8编码的转换流,写入到新文本文件中 OutputStreamWriter
//此时不写编码格式也会默认是UTF-8,默认为平台的编码
OutputStreamWriter fs = new OutputStreamWriter(new FileOutputStream(new File("day30-IO\UTF-8.txt")), "UTF-8");
//2.使用转换流读取数据源文件
//2.1定义一个指定长度的字符数组
char[] chars = new char[1024];
//2.2定义一个变量,记录读取到的有效字符个数
int len=0;
//2.3循环读取
while ((len=bgk.read(chars))!=-1){
//读取出来的数据要写入到目的地文件中
fs.write(chars,0,len);
}
//4.关闭流,释放系统资源
fs.close();
bgk.close();