传智播客 2015年 刘意_Java基础视频-深入浅出精华版 笔记(day21~)(2016年3月26日01:10:44)

Posted 阿滔1357

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传智播客 2015年 刘意_Java基础视频-深入浅出精华版 笔记(day21~)(2016年3月26日01:10:44)相关的知识,希望对你有一定的参考价值。

day21 
1.编码表概述和常见编码表
 

计算机只能识别二进制数据,早期由来是电信号。

为了方便应用计算机,让它可以识别各个国家的文字。

就将各个国家的文字用数字来表示,并一一对应,形成一张表。

ASCII:美国标准信息交换码。

用一个字节的7位可以表示。

ISO8859-1:拉丁码表。欧洲码表

用一个字节的8位表示。

GB2312:中国的中文编码表。

GBK:中国的中文编码表升级,融合了更多的中文文字符号。

GB18030:GBK的取代版本

BIG-5码 :通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。

Unicode:国际标准码,融合了多种文字。

所有文字都用两个字节来表示,Java语言使用的就是unicode

UTF-8:最多用三个字节来表示一个字符。

UTF-8不同,它定义了一种“区间规则”,这种规则可以和ASCII编码保持最大程度的兼容:

它将Unicode编码为00000000-0000007F的字符,用单个字节来表示
它将Unicode编码为00000080-000007FF的字符用两个字节表示 
它将Unicode编码为00000800-0000FFFF的字符用3字节表示 
 
技术分享
 
技术分享
 
2.String类中的编码和解码问题
 
String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组
  byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组
 
编码:把看得懂的变成看不懂的
 * String -- byte[]
 * 
 * 解码:把看不懂的变成看得懂的
 * byte[] -- String
 * 
 * 举例:谍战片(发电报,接电报)
 * 
 * 码表:小本子
 *         字符    数值
 * 
 * 要发送一段文字:
 *         今天晚上在老地方见
 * 
 *         发送端:今 -- 数值 -- 二进制 -- 发出去
 *         接收端:接收 -- 二进制 -- 十进制 -- 数值 -- 字符 -- 今
 * 
 *         今天晚上在老地方见
 * 
 * 编码问题简单,只要编码解码的格式是一致的
 
public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "你好";
 
        // String -- byte[]
        byte[] bys = s.getBytes(); // [-60, -29, -70, -61]
        // byte[] bys = s.getBytes("GBK");// [-60, -29, -70, -61]//证明默认是GBK编码
        // byte[] bys = s.getBytes("UTF-8");// [-28, -67, -96, -27, -91, -67]
        System.out.println(Arrays.toString(bys));
 
        // byte[] -- String
        String ss = new String(bys); // 你好
        // String ss = new String(bys, "GBK"); // 你好
        // String ss = new String(bys, "UTF-8"); // ???
        System.out.println(ss);
    }
=======================================
utf-8三个字节为一组,GBK两个字节为一组,如果解码编码不一致会有分组上的问题
 
3.转换流OutputStreamWriter的使用
转换的意思就是利用编码进行数据转换
 
OutputStreamWriter(OutputStream out):根据默认编码字节流的数据转换字符流
  OutputStreamWriter(OutputStream out,String charsetName):根据指定编码把字节流数据转换为字符流
  把字节流转换为字符流。
  字符流 = 字节流 +编码表
 
==================分割线===================
 
public static void main(String[] args) throws IOException {
        // 创建对象
        // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
        // "osw.txt")); // 默认GBK
        // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
        // "osw.txt"), "GBK"); // 指定GBK
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
                "osw.txt"), "UTF-8"); // 指定UTF-8
        // 写数据,这个方法可以直接写字符串,实在太方便了!!
        osw.write("中国");
 
        // 释放资源
        osw.close();
    }
4.转换流InputStreamReader的使用
InputStreamReader(InputStream is):用默认的编码读取数据
  InputStreamReader(InputStream is,String charsetName):用指定的编码读取数据
 
public static void main(String[] args) throws IOException {
        // 创建对象
        // InputStreamReader isr = new InputStreamReader(new FileInputStream(
        // "osw.txt"));
 
        InputStreamReader isr = new InputStreamReader(new FileInputStream(
                "osw.txt"), "UTF-8");
 
        // 读取数据
        // 一次读取一个字符//注意,这是字符流!!!不再是一次读一个字节!!!应该是一次读一个字符
        int ch = 0;
        while ((ch = isr.read()) != -1) {
            System.out.print((char) ch);
        }
 
        // 释放资源
        isr.close();
    }
 
5.字符流的5种写数据的方式
首先一个要注意的问题,flush问题
===============================
// 创建对象
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
                "osw2.txt"));
 
        // 写数据
        // public void write(int c):写一个字符
        // osw.write(‘a‘);
        // osw.write(97);
        // 为什么数据没有进去呢?(在没写close之前数据没办法显示在txt文件中)
        // 原因是:字符 = 2字节
        // 文件中数据存储的基本单位是字节。(一个一个字节,停留在缓冲)
        //但是,如果没有flush,但有close的话,字符还是可以正常输出的
        // void flush()
 
      // 刷新缓冲区
        osw.flush();
===============================

 

技术分享

 

 

 

close()方法强制刷新(完成了先刷新后关闭的功能)
 
OutputStreamWriter的方法:
 * public void write(int c):写一个字符(可以传‘a‘,也可以传97)
 * public void write(char[] cbuf):写一个字符数组
 * public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
 * public void write(String str):写一个字符串
 * public void write(String str,int off,int len):写一个字符串的一部分
 
 面试题:close()和flush()的区别?
 * A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
 * B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。(用于数据量大时刷新)
 
6.字符流的2种读数据的方式
InputStreamReader的方法:
  int read():一次读取一个字符
  int read(char[] chs):一次读取一个字符数组
 
public static void main(String[] args) throws IOException {
        // 创建对象
        InputStreamReader isr = new InputStreamReader(new FileInputStream(
                "StringDemo.java"));
 
        // 一次读取一个字符
        // int ch = 0;
        // while ((ch = isr.read()) != -1) {
        // System.out.print((char) ch);
        // }
 
        // 一次读取一个字符数组
        char[] chs = new char[1024];
        int len = 0;
        while ((len = isr.read(chs)) != -1) {
            System.out.print(new String(chs, 0, len));
        }
 
        // 释放资源
        isr.close();
    }
 
7.字符流复制文本文件案例1----copyfile
 
需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
  
  数据源:
          a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader
  目的地:
          b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter
==========================================
public static void main(String[] args) throws IOException {
        // 封装数据源
        InputStreamReader isr = new InputStreamReader(new FileInputStream(
                "a.txt"));
        // 封装目的地
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
                "b.txt"));
 
        // 读写数据
        // 方式1
        // int ch = 0;
        // while ((ch = isr.read()) != -1) {
        // osw.write(ch);
        // }
 
        // 方式2
        char[] chs = new char[1024];
        int len = 0;
        while ((len = isr.read(chs)) != -1) {
            osw.write(chs, 0, len);//注意这里
            // osw.flush();//可选动作
        }
 
        // 释放资源
        osw.close();
        isr.close();
    }
=============================================
8.转换流的简化写法

 

技术分享

 

解析:InputStreamReader,OutputStreamWriter 充当桥梁的作用(连接字节流和字符流)
而有时候写起来很麻烦,因此借用一个便捷子类来简化书写
技术分享
 
 InputStreamReader isr = new InputStreamReader(new FileInputStream(
                "a.txt"));
等价于 FileReader fr = new FileReader("a.txt");
 
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
                "b.txt"));
等价于 FileWriter fw = new FileWriter("b.txt");
 
代码被简化
====================================================
需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
 
 数据源:
         a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader
  目的地:
          b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter
 
public static void main(String[] args) throws IOException {
        // 封装数据源
        FileReader fr = new FileReader("a.txt");
        // 封装目的地
        FileWriter fw = new FileWriter("b.txt");
 
        // 一次一个字符
        // int ch = 0;
        // while ((ch = fr.read()) != -1) {
        // fw.write(ch);
        // }
 
        // 一次一个字符数组
        char[] chs = new char[1024];
        int len = 0;
        while ((len = fr.read(chs)) != -1) {
            fw.write(chs, 0, len);
            fw.flush();
        }
 
        // 释放资源
        fw.close();
        fr.close();
    }
==================================================
9.字符缓冲输出流BufferedWriter的使用
字符流为了高效读写,也提供了对应的字符缓冲流。
  BufferedWriter:字符缓冲输出流
  BufferedReader:字符缓冲输入流
  
  BufferedWriter:字符缓冲输出流
  将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 
  可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。 
public static void main(String[] args) throws IOException {
        // BufferedWriter(Writer out)
        // BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
        // new FileOutputStream("bw.txt")));//原始写法,带转换流
 
        BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
 
        bw.write("hello");
        bw.write("world");
        bw.write("java");
        bw.flush();
 
        bw.close();
    }
 
10.字符缓冲输入流BufferedReader的使用
BufferedReader
  从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 
  可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
BufferedReader(Reader in)
 
public static void main(String[] args) throws IOException {
        // 创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
 
        // 方式1
        // int ch = 0;
        // while ((ch = br.read()) != -1) {
        // System.out.print((char) ch);
        // }
 
        // 方式2
        char[] chs = new char[1024];
        int len = 0;
        while ((len = br.read(chs)) != -1) {
            System.out.print(new String(chs, 0, len));
        }
 
        // 释放资源
        br.close();
    } 
 
11.字符缓冲流复制文本文件案例1
需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
  
  数据源:
          a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader -- BufferedReader
  目的地:
          b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter -- BufferedWriter
public static void main(String[] args) throws IOException {
        // 封装数据源
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));
        // 封装目的地
        BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
 
        // 两种方式其中的一种一次读写一个字符数组
        char[] chs =&n


以上是关于传智播客 2015年 刘意_Java基础视频-深入浅出精华版 笔记(day21~)(2016年3月26日01:10:44)的主要内容,如果未能解决你的问题,请参考以下文章

高清未加密2015传智播客 最新21期c#asp.net 基础到就业班视频和源码

传z播客 刘意_2015年Java基础视频笔记(day18~)(2016年3月7日00:25:16)

2018年3月python传智播客人工智能基础就业班全套视频教程

传智播客 安卓 视频 教程

2018年3月python传智播客人工智能基础就业班全套视频教程

2016最新传智播客PHP基础班就业班培训视频下载地址