黑马程序员技术交流社区

标题: 【石家庄校区】编码表的概述及在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