A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dyynrahbsqt 中级黑马   /  2018-11-26 16:53  /  756 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

day10--缓冲流 转换流 序列化流 打印
缓冲流缓冲流的原理缓冲流的原理:
        底层也是使用基本流(FileXxx)来读写
        但缓冲流内部定义了一个缓冲数组, 在读的时候类似于我们一次读一个数组的方式, 减少了磁盘操作次数, 提高了程序效率
缓冲流的效率测试: 复制文件
缓冲流 + 一次读写一个字节数组 效率最高
缓冲字符输出流: BufferedWriterjava.io.BufferedWriter类:
        // 构造方法
        BufferedWriter(Writer out): 使用基本流创建一个缓冲字符输出流
        BufferedWriter(Writer out, int size): 使用基本流创建一个缓冲字符输出流, 设置缓冲区大小
        // 特有方法
        void newLine(): 写入一个换行符, 换行符自动根据当前系统确定
字符集和编码表: 字符集包含编码表
        ASCII字符集
                ASCII编码表
        ISO-8859-1字符集:
                Latin-1: 拉丁字符. 没有中文. 每个字符由1个byte组成
        GB字符集
                GB2312编码表: 每个字符由2个byte组成
                GBK编码表: 每个字符由2个byte组成
                GB18030编码表: 每个字符由1, 2, 4个byte组成
        Unicode
                UTF-8: ASCII字符占1个byte, 拉丁字符占2个byte, 中文占3个byte, Unicode辅助字符占4个byte
                UTF-16
                UTF-32
        ANSI: 表示使用系统默认编码表
乱码问题: FileReader读取GBK编码
乱码原因: 读写编码不一致
        GBK文件中存储的是"你好"在GBK中对应的byte
        而IDEA中使用FileReader读取文件时, 是将byte按照UTF-8编码表查找字符, 结果找不到, 就显示了问号
序列化流(对象流)序列化和反序列化概述
序列化: 内存中的对象转换为字节序列, 以流的方式写入到磁盘的文件中
        对象转字节
反序列化: 磁盘文件中的字节序列, 以流的方式读取到内存中变成对象
        字节转对象
注意:
        被读写的对象的类, 必须实现 java.io.Serializable 接口, 否则会抛出 NotSerializableException
        
        该类的所有属性也都必须是可序列化的. (实现 java.io.Serializable 接口)
        如果某个属性不需要序列化, 则需要用 transient 修饰为瞬态的
        如果要将集合序列化, 那么集合中存储的对象也必须是可序列化的
transient瞬态关键字: 避免属性序列化
static 修饰的成员变量属于类不属于对象, 所以不能序列化
transient 修饰的成员变量, 不能被序列化

如果对象的某个属性不希望被序列化, 可以使用transient修饰, 这样就不会被对象流写到文件中
InvalidClassException异常: 原因和解决方案
serialVersionUID序列号的作用:
        序列化操作时, 会根据类生成一个默认的 serialVersionUID 属性, 写入到文件中.
        该版本号是根据类中成员计算出来的一个数值. 当类的成员发生改变时, 序列版本号也会发生变化
        当代码中的类和读取的对象序列版本号不一致时, 就会抛出InvalidClassException

为了避免这种问题, 我们可以手动写死这个序列号, 这样无论成员如何变化, 序列版本号都是一样的
打印流打印流PrintStream: 概述和使用
PrintStream特点:
        1. 只有输出流, 没有输入流
        2. PrintStream永远不会抛出IOException
        3. 有特殊方法 print(), println(), 可以输出任意类型的值

java.io.PrintStream类: 字节打印流
        // 构造方法
        PrintStream(File file): 创建字节打印流, 输出到一个文件
        PrintStream(OutputStream out): 创建字节打印流, 输出到一个字节输出流
        PrintStream(String fileName): 创建字节打印流, 输出到一个文件路径
        
注意事项:
        如果用 write() 方法, 会查编码表
        如果用 print(), println(), 则原样输出
        
java.lang.System类:
        // 静态方法
        static void setOut(PrintStream out): 设置System.out的输出目的地为参数的打印流
IO框架体系结构
// 体系结构:
字节流
        |_ InputStream                 # 字节输入流
        |        |_ FileInputStream         # 专门操作文件的字节输入流
        |        |_ BufferedInputStream     # 带有缓冲区的字节输入流, 效率高
        |        |_ ObjectInputStream       # 对象输入流
        |
        |_ OutputStream                # 字节输出流
                |_ FileOutputStream        # 专门操作文件的字节输出流
                |_ BufferedOutputStream    # 带有缓冲区的字节输出流, 效率高
                |_ ObjectOutputStream      # 对象输出流
                |_ PrintStream             # 字节打印流
字符流
        |_ Reader                      # 字符输入流
        |        |_ BufferedReader          # 带有缓冲区的字符输入流, 效率高
        |        |_ InputStreamReader       # 将字节流转换为字符流输入的转换输入流
        |                |_ FileReader          # 专门操作文件的字符输入流        
        |
        |_ Writer                      # 字符输出流
                |_ BufferedWriter          # 带有缓冲区的字符输出流, 效率高
                |_ OutputStreamWriter      # 将字符流转换为字节流输出的转换输出流
                |     |_ FileWriter         # 专门操作文件的字符输出流

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马