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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李皓321 初级黑马   /  2018-4-23 15:45  /  579 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小石姐姐 于 2018-4-25 15:48 编辑

day10 IO(标准输入流, 转换流, 打印流, 对象操作

流, Properties集合, 编码表)


IO流
|_ 标准流
            |_ System.in(InputStream)           键盘录入
            |_ System.out(PrintStream)         控制台输出
|_ 转换流
|_ OutputStreamWriter             以操作字符流的方式按字节流写出
|_ InputStreamReader              以操作字符流的方式按字节流读入
|_ 打印流
|_ PrintWriter                        具有自动刷新, 自动换行的特点
|_ 对象流
|_ ObjectInputStream           从文件中读入一个对象到内存中
|_ ObjectOutputStream        将内存中的对象写入到文件中
集合
|_ Properties 用于与IO流结合读取配置文件, 键值对形式, 实现Map(key-value)
乱码
|_ 乱码的原因: 多种编码表查错了
|_ 字符串编码的转换



# 体系结构:
字节流
|_ InputStream                            # 字节输入流
|          |_ FileInputStream           # 专门操作文件的字节输入流
|          |_ BufferedInputStream   # 带有缓冲区的字节输入流, 效率高
|          |_ ObjectInputStream      # 对象输入流
|
|_ OutputStream                         # 字节输出流
|_ FileOutputStream        # 专门操作文件的字节输出流
|_ BufferedOutputStream # 带有缓冲区的字节输出流, 效率高
|_ ObjectOutputStream    # 对象输出流
|_ PrintStream                  # 字节打印流
字符流
|_ Reader                                          # 字符输入流
|               |_ BufferedReader             # 带有缓冲区的字符输入流, 效率高
|               |_ InputStreamReader     # 将字节流转换为字符流输入的转换输入流
|                        |_ FileReader          # 专门操作文件的字符输入流
|
|_ Writer # 字符输出流
|_ BufferedWriter            # 带有缓冲区的字符输出流, 效率高
|_ OutputStreamWriter   # 将字符流转换为字节流输出的转换输出流
                           |_ FileWriter         # 专门操作文件的字符输出流
                 |_ PrintWriter                 # 字符打印流
标准输入输出流概述:
  • 类字段:


                    静态成员变量。
  •    System类的类字段


    •   err:标准错误输出流。命令行输出错误信息


                      是PrintStream,  OutputStream 的子类, 属于字节输出流




    •   in : 标准输入流。键盘输入


                      是 InputStream 类, 属于字节输入流.  InputStream in =
                       System.in;               
  • out:标准输出流,将数据输出到控制台


              是PrintStream,  OutputStream 的子类, 属于字节输出流.
               OutputStream out = System.out;
OutputStreamWriter概述和使用: 文件内容打印到控制台:
1,   补充String类的相关方法
              构造方法 (作用: byte[] 转 String)
                       String(byte[] bys, int index, int length) : 使用byte数组的一部
                       分按照系统默认编码表(GBK)创建String, 即将byte数组转为
                       String
              成员方法 (作用: String 转 byte[])
                       byte[] getBytes() : 按照默认编码表获取字符串的byte数组, 即
                       将String转为byte数组
2,OutputStreamWriter 类:
              是 Writer 的子类, 属于字符输出流. 是字符流通向字节流的桥梁
              作用:
                    以写出字符流的方式编写代码(char, char[], String), 而底层以字
                      节流写出到文件(byte, byte[])实现这种转换:  Writer ->
                      OutputStreamWriter -> OutputStream
打印流概述
  •   分类:


  •      PrintStream : 字节打印流
  •       PrintWriter:字符打印流,
  •      只有输出流 打印就是输出操作


  • PrintWriter , 字符打印输出流的特点


  • 自动换行.  println() . 会根据系统自动确定换行符
  • 自动刷新. 通过构造方法的配置可以实现(只在调用 println() ,  printf() ,  format() 时有用)
  • 也是包装流, 类似于 BufferedWriter , 自身没有写出功能
  • 可以把字节输出流转换为字符输出流
  • 不能输出byte字节, 可以输出其他任意类型(要输出字节可以使用PrintStream)
  • 关流不会抛出异常(此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常)


对象操作流概述:
  • 对象操作流 (都属于字节流)


  •        ObjectInputStream


      构造方法
ObjectInputStream(InputStream in) : 创建对象输入流
成员方法
Object readObject() : 从对象输入流读取对象, 一次只读取一个对象. 当读不到时抛出EOFException .
          2,ObjectOutputStream
构造方法
    ObjectOutputStream(OutputStream out) : 创建对象输出流
成员方法
     void writeObject(Object o) : 将对象写入对象输出流
  • 作用:


                 读写任意类型的对象
  • 注意:


  • 使用对象输出流写出对象到文件, 则该文件只能使用对象输入流读取对象, 其他流不行
  • 只能将实现了 java.io.Serializable 接口的类的对象写入流中, 对象内部有自定义类型的成员变量, 也要实现该接口


  • java.io.Serializable 接口:


  • 没有成员, 是一个标识接口
  • 用于序列化


             序列化: 将对象的信息转换为可存储的信息的过程
Properties概述
  • java.util.Properties


             构造方法
                   Properties() : 创建对象
             成员方法
  • 可以使用Map接口的方法
  • String getProperty(String key) : 根据键获取值. 如果找不到该键, 则返回null
  • String getProperty(String key, String defaultValue) : 根据键获取值, 如果值不存在, 则使用指定的默认值
  • void setProperty(String key, String value) : 设置键值对
  • 继承了 Hashtable<K, V> , 实现 Map<K,V> 接口, 以键值对方式存储数据
  • 作用: 保存键值对信息, 可与IO流结合使用, 将数据方便的写入到文件, 或从文件中读取到集合
  • 应用场景: 保存程序的配置信息
  • 配置文件的格式和语法:


在配置文件中的保存形式是每行一个 键=值
# 是注释
         注意:
  • 不能存 null 的键和值
  • 只能保存英文数字和符号, 默认使用 ISO-8859-1 编码, 存中文会显示乱码


                 注意: 如果配置文件保存为 .txt , 使用Eclipse打开会变成
                         GBK 编码, 可以显示中文. 但一般都存为 .properties
                       , 使用 ISO-8859-1 , 显示不了中文
  • 键和值都是字符串


Properties和IO流结合的功能
  • Properties类常用方法


  •    从配置文件中加载到Properties集合


void load(InputStream in) : 从字节输入流中读取Properties
void load(Reader reader) : 同上, 只是流不同
      2,从Properties集合写出到配置文件
  • void list(PrintStream out) : 将Properties输出到指定的字节打印输出流.会自动加一个 -- listing properties -- 文件头
  • void list(PrintWriter writer) : 同上, 只是流不同会自动加一个 -- listing properties -- 文件头


  • void store(Writer writer, String comments) : 将Properties输出到指定的输出流, 并添加一个注释. 如不想增加注释可填写null.


           无论是否有注释, 都会自动添加时间字符串
  • void store(OutputStream os, String comments) : 同上, 只是流不同


            无论是否有注释, 都会自动添加时间字符
  • list() 和 store() 的区别


    • list只能接收打印流(PrintStream, PrintWriter)
    • store可以接收任何输出流(OutputStream, Writer)


  • 常用Propertis的读写操作步骤


         写出到文件
               创建Properties对象, 添加键值对, 使用 list() 或 store() 保存
               到文件中
        从文件读取
               创建Properties对象, 使用 load() 从文件加载数据, 使用
              getProperties() 根据指定键获取值, 或使用遍历Map的方式
              遍历所有键和值
编码表
作用:
        将计算机二进制数据转换为不同语言的字符
常见种类:
ASCII:美国标准码,包含26个英文字母的大写和小写,数字,符号
ISO-8859-1 : 西方语言编码
GB2312 : 国标码
GBK : 国标扩展码
Unicode : 万国码. 支持多国语言字符.
UTF-8 : Unicode的一种实现方式, 长度可变的码表, 一个字符占用1
           个或2个或3个字节
ANSI : 本地编码表. 根据系统设置决定编码表

0 个回复

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