黑马程序员技术交流社区

标题: 第二十一天内容 字节流复制,数组缓冲,缓冲区对象,字符流 [打印本页]

作者: 王冀仁    时间: 2015-12-19 15:32
标题: 第二十一天内容 字节流复制,数组缓冲,缓冲区对象,字符流
第二十一天内容 字节流复制,数组缓冲,缓冲区对象,字符流

1. 字节流进行文件复制
  A. 字节输入流,读取数据源字节
    FileInputStream 读取1个字节
  B. 字节输出流,写入数据目的字节
    FileOutputStream 写1个字节

2. FileInputStream读取文件
  int read() 每次读取1个字节,返回int值
  文件结尾返回-1

  read()方法重载形式

  A. int read(byte[] b)
   方法中传递字节数组,流对象,将读取到的字节存储数组中
   实现缓冲区作用,提高效率

   int 返回值作用
   数组里面存储的又是什么

   InputStream类,读取字节数组方式
   int fis.read(bytes) 返回每次读取,存储数组的有效个数
   OutputStream类,写字节数组

    void write(byte[] b, int off, int len)
    写字节数组,从0开始,写几个,有效个数

3. IO中的缓冲流对象
   读写数组,速度比读写单个字节快

   JDK设计的时候,也考虑到效率问题,因此开发好了缓冲区流对象,
   提高效率

   A. BufferedOutputStream
     字节输出流缓冲区对象,目的提高字节输出流的写入效率

     BufferedOutputStream继承OutputStream
     写的方法write,已经不需要学习了

     构造方法:
       BufferedOutputStream(OutputStream out)
       传递的是OutputStream任意子类对象,可以传递任何字节输出流
       为什么要传递字节输出流,BufferedOutputStream提高效率
       提高谁的效率,构造方法中,传递的是谁,就提高谁

       BufferedOutputStream(new FileOutputStream())

      原理,自身有字节数组,我们写的数据,直接写在他的数组中
      一次性写入文件中

   B. BufferedInputStream
     字节输入流对象,目的提高字节输入流的读取效率

     BufferedInputStream继承InputStream
     读取方法,不需要学习,读取单个字节,读取字节数组

     构造方法:
       BufferedInputStream(InputStream in)
       传递的是InputStream任意子类对象,可以传递任意的字节输入流
       传递的是谁,就对谁提高效率

       new BufferedInputStream(new FileInputStream())

4. 字符编码

  A. 编码表的由来
    计算机电信号,变成数字信号,01
    让算计机直接识别人类文件
    美国,制定编码表,让人类的文字对应数字
    97 字母 a
    98 字母 b
    47 数字 0

    ASCII编码表: 数字,字母,符号

  B. 简体中文编码表
    数字对应汉字
    两个数字,两个字节对应1个汉字,汉字采用负数表示
    汉字两个字节,第一个字节肯定是负数,第二个字节可能是正数,可能是负数
    出现第一张简体中文编码表  GB2312, Windows 95-98  Windows3.X
    汉字存储量少,4000个汉字

    编码扩容,汉字数量20000个, GBK 2000-10
    Windows中文版系统,默认编码表都是GBK

    再一次扩容, GB18030

   C. Big5
    大五码, 繁体中文编码表,香港,澳门,台湾

   D. ISO8859-1编码表
    拉丁文编码表
    编码表中没有中文
    JavaWeb,程序运行在互联网的世界
    网络服务器软件, Apache Tomcat(拉丁文)
   
   E. Unicode万国码
     国际标准化组织,让一张码表融合全球所有语言
     Unicode采用2个字节存储1个汉字,
     Java中的char,就是Unicode
   
   F. UTF-8编码表
     万国码,汉字采用3个字节存储

     中,GBK,UTF-8

     开发中文版程序的困难

     浏览器混乱:
      IE FireFox Chrome Safari Opera

5. 字符串的编码和解码

  A. 字符串的编码
    将看的懂的,变成看不懂的
    字符串转成字节数组
  
  B. 字符串的解码
    将看不懂,变成看的懂的
    字节数组变成字符串

    编码: String类方法getBytes()
    解码: String类构造方法

6. 字符流
  读写纯文本文件,中文也行

  A. OutputStreamWriter 转换流
   OutputStreamWriter 继承Writer
   写的方法 write 字符,字符数组,字符数组一个部分,写字符串

   作用: 字符流向字节的桥梁, 字符转成字节

   构造方法:
     OutputStreamWriter(OutputStream out)
     传递任意的字节输出流
     OutputStreamWriter流,将数据变成字节,写入传递的字节流中

     new OutputStreamWriter(new FileOutputStream())

     OutputStreamWriter(OutputStream out,String 编码表名)

   发现现象: 字节流,还是字符流,写数据方法都是write
   区别: 字节流写的是byte
         字符流写的是char, String

   B. InputStreamReader 转换流
     InputStreamReader继承Reader
     读取的方法read,读取单个字符,读取字符数组

     作用: 字节流向字符的桥梁

     构造方法:
       InputStreamReader(InputStream in)
       传递任意字节输入流,转换流从传递字节输入流中,读取数据
       自己会进行自己的判断,如果是负数字节,让字节流再次读取

       new InputStreamReader( new FileInputStream())

       InputStreamReader(InputStream in,String 编码表名字)

7. 转换流的便捷类

  A. OutputStreamWriter 类
   子类  FileWriter, 继承OutputStreamWriter
   FileWriter是OutputStreamWriter类便捷写法

   前提: 操作的文件必须是操作系统中的默认编码表才可以

   FileWriter 构造方法
     FileWriter(File file)传递File对象,写入目的
     FileWriter(String filename)传递字符串文件名

  B. InputStreamReader 类
   子类 FileReader,继承InputStreamReader
   FileReader类是InputStreamReader类便捷写法

   前提: 操作的文件必须是操作系统中的默认编码表才可以

   构造方法
     FileReader(File file)传递File对象,读取数据源
     FileReader(String filename) 传递字符串文件名,读取数据源

   读取方法:
     read() 1个字符,
     read(char[] c)字符数组
作者: hi丶bo    时间: 2015-12-19 19:24
+++++++++++++++++++++++++
作者: DayBreak    时间: 2015-12-19 21:46
直接把老师的总结篓上来了..




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2