Java学习笔记六

一、编码表
1.因为计算机语言是用二进制表示的,为了将计算机在全世界使用,那么就要使相同的二进制在不同地区表示不同的语言,这就形成了二进制数据与语言一一对应的表————–编码表。
2.常用编码表:

  • ASCII———-美国地区使用的编码表,一个字符占一个字节
  • ISO8859-1:拉丁码表。欧洲码表,一个字符占一个字节
  • GB2312/GBK/GB18030: 中国大陆用的编码表,gbk是gb2312的升级版,gb18030是gbk的升级版。一个中文字符占两个字节;一个英文字符占一个字节。
  • BIG5码:通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。一个英文字符占一个字节,一个中文字符占一个或两个字节。
  • unicode码:国际通用码,收录各国语言,一个字符用两个字节,java就是用的这种编码。
  • UTF-8: utf系列码中比较常用的,一个中文字符占三个字节,一个英文字符占一个字节。
  • -

3.内码和外码:内码是指数据存储到内存中所使用的内存中的编码方式;外码:除内存中的编码外,都是外码。java中字符char在内存中使用的编码方式是utf-16(一个字符占两个字节)。
4.所谓编码就是将看得懂得变成看不懂的;所谓解码就是将看不懂的变成看的懂得。
5.编码通常说的是字符编码。
6.字符编码过程:首先拿到输入的内容,根据指定的编码方式到编码表中找出对应的字节数。
解释:
接下来我们讲解一个程程序用以实验不同编码方式

    String chinese = "中";
        String english = "A"; 
        System.out.println("中文字符:"+chinese+"  英文字符:"+english);
        byte[] chineseBy = chinese.getBytes(); 
        byte[] englishBy = english.getBytes(); 
        System.out.println("指定的编码方式:.getBytes()默认编码方式");
        System.out.print("中文编码后:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文编码后:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        chineseBy = chinese.getBytes("gbk"); 
        englishBy = english.getBytes("gbk"); 
        System.out.println("指定的编码方式:gbk");
        System.out.print("中文编码后:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文编码后:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        chineseBy = chinese.getBytes("ASCII"); 
        englishBy = english.getBytes("ASCII"); 
        System.out.println("指定的编码方式:ASCII");
        System.out.print("中文编码后:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文编码后:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        chineseBy = chinese.getBytes("UTF-8"); 
        englishBy = english.getBytes("UTF-8"); 
        System.out.println("指定的编码方式:UTF-8");
        System.out.print("中文编码后:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文编码后:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        /*unicodeLittle:采用Unicode编码,并对编码后的结果反转 (4e2d反转为2d4e) ,这种方式有字符串标记位(-2 -1)*/
        chineseBy = chinese.getBytes("UNICODELittle"); 
        englishBy = english.getBytes("UNICODELittle"); 
        System.out.println("指定的编码方式:UNICODELittle");
        System.out.print("中文编码后:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文编码后:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        /*unicode:采用Unicode编码,这种方式有字符串标记位(-2 -1)*/
        chineseBy = chinese.getBytes("UNICODE"); 
        englishBy = english.getBytes("UNICODE"); 
        System.out.println("指定的编码方式:UNICODE");
        System.out.print("中文编码后:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文编码后:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        /*UNICODEBigunmarked:采用Unicode编码,这种方式没有字符串标记位(-2 -1)*/
        chineseBy = chinese.getBytes("UNICODEBigunmarked"); 
        englishBy = english.getBytes("UNICODEBigunmarked"); 
        System.out.println("指定的编码方式:UNICODEBigunmarked");
        System.out.print("中文编码后:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文编码后:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        } 

调用 .getBytes时没有指定编码方式,则默认使用操作系统默认的编码方式(我的是gbk编码的),所以没有指定编码方式和指定 gbk 编码方式 输出结果一致。
二、管道流的基本使用

try(PipedInputStream pis = new PipedInputStream();
                PipedOutputStream pos = new PipedOutputStream();){
            pos.connect(pis);
            for(int i = 0; i < 10; i++){
                pos.write(i);
                System.out.println("写入:"+i);
            }
            int i = -1;
            while((i = pis.read()) != -1){
                System.out.println("读到:"+i);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

小知识点:
1、输入流:从IO设备中读取数据。
2、输出流:写数据到IO设备。
3、int available():返回输入流中的字节数量。
4、IO包装类:

  • ObjectInputStream、ObjectOutputStream :操作对象,读写的对象必须被串行化,对象中的transient(临时)和static类型的成员变量不会被读取和写入。
  • DataInputStream、DataOutputStream : 可以操作八大基本数据类型
  • BufferInputStream、BufferOutputStream :利用缓存技术
  • BufferReader—提供readLine()、BufferWriter—提供newLine(); :利用缓存技术
  • PrintStream—字节标准输出、PrintWriter—字符标准输出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值