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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 cyahua 于 2018-4-24 18:53 编辑

【石家庄校区】IO流&编码 学习笔记
IO流IO流体系

  • 按照流的用途:

  文件输入输出流

      |_ 字节流

          |_ FileInputStream

          |_ FileOutputStream

      |_ 字符流

          |_ FileReader

          |_ FileWriter

  缓冲输入输出流

      |_ 字节流

          |_ BufferedInputStream

          |_ BufferedOutputStream

      |_ 字符流

          |_ BufferedReader

          |_ BufferedWriter

  对象输入输出流

      |_ 字节流

          |_ ObjectInputStream

          |_ ObjectOutputStream

  打印输出流

      |_ 字节流

          |_ PrintStream

      |_ 字符流

          |_ PrintWriter

  转换流

      |_ 字符流

          |_ InputStreamReader

          |_ OutputStreamWriter

  • 按体系结构:


  字节流

      |_ InputStream                 # 字节输入流

      |   |_ FileInputStream         # 专门操作文件的字节输入流

      |   |_ BufferedInputStream     # 带有缓冲区的字节输入流, 效率高

      |   |_ ObjectInputStream       # 对象输入流

      |

      |_ OutputStream                # 字节输出流

          |_ FileOutputStream        # 专门操作文件的字节输出流

          |_ BufferedOutputStream    # 带有缓冲区的字节输出流, 效率高

          |_ ObjectOutputStream      # 对象输出流

          |_ PrintStream             # 字节打印流

  字符流

      |_ Reader                      # 字符输入流

      |   |_ BufferedReader          # 带有缓冲区的字符输入流, 效率高

      |   |_ InputStreamReader       # 将字节流转换为字符流输入的转换输入流

      |       |_ FileReader          # 专门操作文件的字符输入流   

      |

      |_ Writer                      # 字符输出流

          |_ BufferedWriter          # 带有缓冲区的字符输出流, 效率高

          |_ OutputStreamWriter      # 将字符流转换为字节流输出的转换输出流

               |_ FileWriter         # 专门操作文件的字符输出流

          |_ PrintWriter             # 字符打印流File类构造方法

  • File File(String pathname)
  • File File(String parent, String child)
  • File File(File parent, String child)

常用成员方法

  • 创建

    • boolean createNewFile():创建一个新文件. 返回是否创建成功
    • boolean mkdir():创建目录, 返回是否创建成功
    • boolean mkdirs():创建多层目录, 包括指定路径中缺少的父级目录. 返回是否创建成功

  • 删除

    • boolean delete():删除文件或目录. 返回是否删除成功

  • 获取

    • String getPath(): 获取创建File对象时使用的路径(创建时是相对路径则返回相对路径, 是绝对路径则返回绝对路径)
    • String getAbsolutePath(): 获取File对象的绝对路径字符串
    • File getAbsoluteFile(): 获取包含绝对路径的File对象
    • String getParent(): 获取File对象的父路径字符串
    • File getParentFile(): 获取File对象的父路径的File对象
    • String getName(): 获取File对象代表的文件名或目录名(不含上层目录)
    • long length(): 获取File对象所表示的文件的大小, 单位byte

      • 注意: 如果File对象是一个目录, 则返回值不确定; 如果文件不存在, 则返回0L

    • long lastModified(): 获取文件上次修改时间

  • 判断

    • boolean exists(): 判断文件或目录是否存在
    • boolean isAbsolute(): 判断File中保存的是否是绝对路径

      • 注意: 无论该文件是否真实存在, 只判断创建File时使用的路径字符串

    • boolean isDirectory(): 判断该File对象是否为目录
    • boolean isFile(): 判断该File对象是否为文件
    • boolean isHidden(): 判断该文件或目录是否为隐藏的

  • 修改

    • boolean renameTo(File dest): 修改文件名

  • 重要的获取功能

    • String[] list(): 获取当前路径下所有文件和目录名称(不包括父路径). File对象必须是目录, 否则会报错
    • File[] listFiles(): 获取当前路径下的所有文件和目录的File对象. File对象必须是目录
    • static File[] listRoots(): 返回系统的所有根路径. windows系统就是各种盘符


字节流

  • InputStream

    • FileInputStream和BufferedInputStream

      • int read(): 读取一个字节, 读完返回-1

        • 注意返回值是int类型, 而不是byte

      • int read(byte[] b): 读取字节到数组中, 返回读取的长度. 读完返回-1
      • close(): 释放资源


  • OutputSteam

    • FileOutputStream和BufferedOutputStream

      • void write(byte b): 写一个字节
      • void write(byte[] b, int offset, int len): 从字节数组的指定索引开始写入指定长度个字节
      • close(): 释放资源



标准流

  • System.err: 标准错误流. (命令行输出错误信息)
  • System.in: 标准输入流. (键盘输入)

    • 是InputStream类, 属于字节输入流

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

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


转换流

  • InputStreamReader: 字节输入流转字符输入流

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

  • OutputStreamWriter: 字符输出流转字节输出流

    • 是Writer的子类, 属于字符输出流

  • 特点

    • 转换流也是包装类, 需要传入实际的输入输出流对象


打印流

  • PrintStream: 字节打印流
  • PrintWriter: 字符打印流
  • PrintWriter打印流的特点

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


  • 构造方法

    • 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
  • OutputStream
  • 注意

    • 使用对象输出流写出对象到文件, 该文件只能使用对象输入流读取对象
    • 只能将实现了java.io.Serializable接口的对象写入流中

  • Serializable接口

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

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


  • 构造方法

    • ObjectOutputStream ObjectOutputStream(OutputStream out): 创建对象输出流
    • ObjectInputStream ObjectInputStream(InputStream in): 创建对象输入流

  • 方法

    • 构造方法:

      • ObjectOutputStream ObjectOutputStream(OutputStream out): 创建对象输出流
      • ObjectInputStream ObjectInputStream(InputStream in): 创建对象输入流

    • 成员方法

      • void writeObject(Object o): 将对象写入对象输出流
      • Object readObject(): 从对象输入流读取对象, 一次只读取一个对象. 当读不到时抛出EOFException



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)



编码表

  • 常见编码表

    • 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 个回复

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