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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-4-26 10:46 编辑

IO流&编码表学习笔记


IO流
    |_ 标准流
        |_ System.in(InputStream)       键盘录入
        |_ System.out(PrintStream)      控制台输出
    |_ 转换流
        |_ OutputStreamWriter           以操作字符流的方式按字节流写出
        |_ InputStreamReader            以操作字符流的方式按字节流读入
    |_ 打印流
        |_ PrintWriter                  具有自动刷新, 自动换行的特点
    |_ 对象流
        |_ ObjectInputStream            从文件中读入一个对象到内存中
        |_ ObjectOutputStream           将内存中的对象写入到文件中标准输入输出流System.err: 标准错误流。(命令行输出错误信息)

System.in :标准输入流(键盘输入)

        是InputStream类,属于字节输入流

system.out: 标准输出流(控制台输出)

        是outputStream的子类PrintStream,属于字节输出流转换流
InputStreamReader:字节输入流转字符输入流

是Reader的子类,属于字符输入流

OutputstreamWriter:字符输出流转字节输出流

是Writer 的子类,属于字符输出流
  • 特点
    转换流也是包装类,需要传入实际的输入输出流对象


    • 打印流
    • PrintStream:字节打印流
    • Print Writer:字符打印流
    • 只有输出流的,因为打印是输出操作
    • 注意
      打印是输出操作,所以打印流只有输出,没有输入
      PrintWriter打印流的特点


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

        • PrintWriter PrintWriter(String filepath)  创建对象
        • PrintWriter PrintWriter(Writer out, boolean autoFlush): 创建对象, 同时设置是否自动刷新
        • PrintWriter(OutputStream out, boolean autoFlush): 创建对象, 同时设置是否自动刷新


        成员方法
        • void write(String s): 写一个字符串
        • void print(String s): 输出字符串, 没有换行
        • void println(String s): 输出字符串并换行. 如果启动了自动刷新, 则会执行自动刷新写入数据
        • void printf(Locale l, String format, Object... args): 使用指定格式字符串和参数将格式化的字符串写入输出流. 如果启动了自动刷新, 则会执行自动刷新写入数据
        • void format(Locale l, String format, Object... args): 使用指定格式字符串和参数将格式化的字符串写入输出流. 如果启动了自动刷新, 则会执行自动刷新写入数据


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

            • 作用: 读写对象到文件
            • ObjectInputStream: 对象输入流
            • Object readObject(): 从对象输入流读取对象, 一次只读取一个对象. 当读不到时抛出EOFException.
            • ObjectOutputStream: 对象输出流
            • 注意


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


            • Serializable接口


              • 标记接口, 用于标记该类可以序列化
              • 序列化:将对象的信息转换为可存储的信息的过程
              • private static final long serialVersionUID: 序列版本号. 用于确定对象和类定义是否一致
              • InvalidClassException用对象读取流时发生该异常的原因:


                • 该类的序列版本号与从流中读取的类描述符的版本号不匹配
                • 该类包含未知数据类型(即可能添加了新的成员变量或方法)
                • 该类没有可访问的无参数构造方法



            • 读取对象异常的优化操作


              • 在对象流中只保存一个对象, 通过该对象保存其他对象


                • 比如用集合存储多个同类型的对象
                • 定义一个类, 其中包含不同类型的其他类型对象




          • Properties


            • 继承Hashtable<K, V>, 实现Map<K, V>
            • 作用: 以键值对方式保存信息到文本文件
            • 应用场景: 作为程序的配置文件
            • 注意不能存null的键和值


              • 只能保存英文字符和符号, 默认使用ISO-8859-1编码, 存中文会显示乱码


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


              • 键和值都是字符串


            • 方法

              • 构造方法


                • Properties Properties()


              • 成员方法


                • 可以使用Map的方法
                • String getProperty(String key): 根据键获取值. 如果找不到该键, 则返回null
                • String getProperty(String key, String defaultValue): 根据键获取值, 如果值不存在, 则使用指定的默认值
                • void setProperty(String key, String value): 设置键值对
                • void load(InputStream in): 从字节输入流中读取Properties
                • void load(Reader reader): 从字符输入流中读取Properties
                • void list(PrintStream out): 将Properties输出到指定的字节打印输出流. 会自动加一个-- listing properties --文件头
                • void list(PrintWriter out): 将Properties输出到指定的字符打印输出流. 会自动加一个-- listing properties --文件头
                • void store(Writer writer, String comments): 将Properties输出到指定的输出流, 并添加一个注释. 如果不想要注释可传null. 无论有没有注释, 都会添加时间字符串的注释
                • void store(OutputStream os, String comments): 同上, 只是流不同


              • list方法和store方法的区别


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



            • Properties读写操作步骤


              • 写出到文件


                • 创建Properties对象, 添加键值对, 使用list()或store()保存到文件中


              • 从文件读取


                • 创建Properties对象, 使用load()从文件加载数据, 使用getProperty()根据指定键获取值, 或使用遍历Map的方式遍历所有键和值




          • 编码表


            • 作用: 将计算机二进制数据转换为不同语言的字符
            • 常见编码表的种类


              • ASCII: 美国标准码. 包含26个英文字母的大写和小写, 数字, 符号
              • ISO-8859-1: 西方语言编码
              • GB2312: 国标码
              • GBK: 国标扩展码
              • Unicode: 万国码. 支持多国语言字符.
              • UTF-8: Unicode的一种实现方式, 长度可变的码表, 一个字符占用1个或2个字节
              • ANSI: 本地编码表. 根据系统设置决定编码表


            • Java String类对于字节和编码的操作


              • byte[] getBytes(): 获取字符串的byte数组, 使用默认编码
              • byte[] getBytes(String charsetName): 获取字符串的byte数组, 使用指定编码
              • String String(byte[] bytes): 将byte数组转化为字符串, 使用默认编码
              • String String(byte[] bytes, String charsetName): 将byte数组转换为字符串, 使用指定编码
              • String String(byte[] bytes, int offset, int len, String charsetName): 将byte数组的一部分转换为字符串, 使用指定编码


            • 处理乱码的2种方式:


              • String通过指定编码转为byte数组, 然后再创建String: (GBK字符串转UTF-8字符串写入文件)


                • 先将String通过目标编码转为byte数组: byte[] bys = "月薪过万".getBytes("UTF-8");
                • 再将byte数组转换为String: String str = new String(bys);
                • 写入到文件: fw.write(str);


              • OutputStreamWriter可以指定编码写入文件, 免去使用String通过编码转换为byte数组的步骤


                • OutputStreamWriter OutputStreamWriter(OutputStream out, String charsetName): 创建转换流对象, 并指定编码



0 个回复

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