黑马程序员技术交流社区
标题:
【石家庄校区】编码表的概述及在IO流中的使用
[打印本页]
作者:
水煮牛蛙
时间:
2018-4-23 15:43
标题:
【石家庄校区】编码表的概述及在IO流中的使用
本帖最后由 小石姐姐 于 2018-4-25 16:39 编辑
编码表的概述及在IO流中的使用
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
/*
* 编码表:把计算机底层的二进制数转换成我们能看到的字符
* ASCII
* GB2312 :信息交换用汉字编码表字符集
* ----GBK:汉字编码表扩展规范
* Unicode:
* 1.所有的字符都占2个字节
* 2.同一码(万国码)
* UTF-8:长度可变的Unicode编码表
*
* ANSI : 本地编码表 GBK
* 它会根据系统环境改变
* 在中文Windows操作系统中它代表GBK编码,
* 在繁体中文Windows操作系统中它代表Big5编码,
*
* 乱码:编码保持前后一致可解决
*
*
*
*/
public class 编码表 {
public static void main(String[] args) throws IOException {
使用指定码表写出文件();
FileInputStream fis = new FileInputStream("a.txt");
byte[] bys = new byte[1024];
int len = fis.read(bys);
System.out.println(new String(bys,0,len));
/*Output:
楂樿柂灏变笟
*///~
//因为"a.txt"文件中的数据是用UTF-8编码写入的,因此使用默认编码表将读取的字节转换为字符时,
//输出的是乱码
// 解决办法 : 使用对应编码表进行转换
System.out.println(new String(bys,0,len,"UTF-8"));
/*Output:
高薪就业
*///~
}
private static void 使用指定码表写出文件() throws UnsupportedEncodingException, FileNotFoundException, IOException {
String s = "高薪就业";
//byte[] bys = s.getBytes();//通过默认编码转换成数据
byte[] bys = s.getBytes("UTF-8");
//使用UTF-8码将字符串s转换为字节,然后输出到使用GBK编码的txt文本上,
//这时点开文件就会出现乱码(原因 : 编码和解码使用的码表不一样)
//解决办法:使用跟文件一样的码表.
FileOutputStream fos = new FileOutputStream("a.txt");
fos.write(bys);
fos.close();
}
}
----------------------------------------------------
>>>>>>>> 将数据写入使用指定编码表的文件中 <<<<<<<<<<
package com.jobday10;
/*
* 正常情况下io流和文本使用的都是默认编码表
* 但是当文本使用的编码表不是默认编码表示,使用默认编码表的io流将数据写入文件后,就会显示成乱码.
* 这时有两种方法将数据写入非默认编码表的文本中:
* 1.将字符转换为字节,然后使用与文本相同的编码表将字节再转为字符串,然后再将字符串写出到文本
* (读取时原理一样)
* 2.使用可以设定使用指定编码表的输出流(转换流具有此功能)OutputStreamwriter(OutputStream out,String charsetName);
* 设定好指定的编码表,输出数据
* (读取也是同样原理)
*
* 注意:
* io流本身是不需要编码的,只是它操作的这些数据是需要编码的.
*/
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
/*
* 字符流中的编码
*
*/
public class 字符流重中的编码 {
public static void main(String[] args) throws IOException {
手动转换字符串为与文件相同的编码();
// 使用指定的编码写出文件,可以解决手动转化编码的麻烦
//通过查看writer的源码,它最终是将自符串转换为字符数组的形式写出的
//FileWriter 类中没用可以使用指定编码写出文件的构造方法
//但是它的父类(转换流)OutputStreamWriter(OutputStream out, String charsetName)
//的构造方法,他可以设定输出流使用的编码表
//注意:io流本身是不需要编码的,只是它操作的这些数据是需要编码的.
//同样输入流的也具有这样的功能:那就是输入流的转换流InputStreamReader()
//InputStreamReader(InputStream in, String charsetName)
//创建使用指定字符集的 InputStreamReader。
String s = "迎娶白富美";
//创建指定使用指定编码的输出流
OutputStreamWriter osw = new OutputStreamWriter((new FileOutputStream("b.txt")),"UTF-8" );
osw.write(s);
//文件中的显示结果----
/*Output:
迎娶白富美
*///~
osw.close();
}
private static void 手动转换字符串为与文件相同的编码() throws IOException, UnsupportedEncodingException {
FileWriter fw = new FileWriter("b.txt");
String s = "月薪过万";
// fw.write(s);
//用字符流使用默认编码将"月薪国过万"字符串,写入UTF-8编码的文件中,文件中的数据是一段乱码
//解决办法:
//使用UTF-8码将"月薪国过万"字符串转换为字节,然后再将字节转换为字符串,这样字符串写入到文件中时,写入的
//就是UTF-8编码的字节了
byte[] bys = s.getBytes("UTF-8");
fw.write(new String(bys));
fw.close();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2