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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

就业班JavaSE高级部分day09 字节流 字符流 Properties
IO流:
输入输出流
流: 数据流
输入: 从硬盘(文件)读取到内存(Java程序)
输出: 从内存(Java程序)写入到硬盘(文件)
        (入和出都是相对于内存来说的)
字节流:
计算机中, 无论文本, 视频, 音频, 图片... 一切都是以"字节byte"形式存储的
也就是以数字形式存储的, 而数字可以用不同进制表示, 计算机能看懂的是二
进制数字
文件存储原理和记事本打开文件的原理:
向文件中写入字节数据时, 十进制的数字会被转换为"二进制"的数字写入文件
文本编辑器打开文本文件时, 会先查询编码表, 将二进制数字转换为对应的字符进行显示
字节输出流:续写换行
java.io.FileOutputStream类: 文件字节输出流
        // 带有 续写 功能的构造方法, 不会清空文件
        Windows系统: "\r\n"  Linux系统: "\n" MacOS系统: "\r"
字节输出流: 一次写一个字节到文件
写数据的原理:
    Java程序 -> JVM虚拟机 -> OS操作系统 -> OS调用写数据的方法 -> 将数据写入文件
使用字节输出流写数据到文件的步骤:
    1. 创建对象: 创建FileOutputStream对象, 构造方法中传递文件路径
    2. 写入数据: 使用FileOutputStream对象调用 write(int b) 方法, 将字节写入文件
    3. 释放资源: 使用FileOutputStream对象调用 close() 方法, 关闭流对象释放资源
字节输出流: 一次写多个字节
Java中, byte的范围是 -128 ~ 127 共256个数值
编码表中字符范围是       0 ~ 255 共256个数值   
写多个字节时:
    如果第一个字节是正数中的 0~127, 则记事本会查询 ASCII码表 显示字符
    如果第一个字节是负数中的:-128~-1, 则记事本会查询 GBK码表 显示字符.(将两个连续的byte组合为一个中文)
字节输入流: 一次读取一个字节
FileInputStream读数据步骤:
    1. 创建FileInputStream对象 2. 使用FileInputStream对象, 调用 int read() 方法, 一次读取一个byte   3. 释放资源
字节输入流: 一次一个字节数组
java.io.InputStream抽象类: 字节输入流 (顶层类)
    int read(byte[] b): 一次读一个字节数组
        参数 byte[] b 作用: 存储每次读到的字节, 起到缓冲作用
        返回值作用: 每次读到的字节个数, 读到文件末尾返回-1   
GBK编码中, 一个汉字占用2个byte
UTF-8编码中, 一个汉字占用3个byte
字符输入流: 2种方式读取文本文件
java.io.Reader抽象类: 字符输入流 (顶层)
    int read(): 一次读一个字符char, 返回读到的字符.
        读到文件末尾返回-1  (返回int为了代码编写方便)
    int read(char[] cbuf): 一次读取一个字符数组char[]
        返回读取的字符个数. 读到文件末尾返回-1
java.lang.String类:
    String(char[] value): 将char数组转换为String
    String(char[] value, int offset, int count): 将char数组的一部分转换为String
字符输出流: Writer和FileWriter
java.io.Writer抽象类: 字符输出流 (顶层类)   'a''b'  缓冲区    97 98
    // 常用成员方法
    abstract void close(): 刷新缓冲区并释放资源
    abstract void flush() :刷新缓冲区
    // 写
    void write(int c): 写一个字符 (int类型为了代码编写方便)
    void write(char[] cbuf): 写一个字符数组
    abstract void write(char[] b, int off, int len): 写一个字符数组的一部分
    void write(String str): 写一个字符串
    void write(String str, int off, int len): 写一个字符串的一部分
    注意: write()方法只是将数据写到内存缓冲区, 最后必须调用flush()或close()才能将数据真正写入磁盘
java.io.FileWriter类: 文件字符输出流
    // 构造方法
    FileWriter(File file): 通过File对象创建文件字符输出流
    FileWriter(String fileName): 通过文件路径创建文件字符输出流
Properties存储数据和遍历
Properties双列集合:
    键和值都是 String 类型
java.util.Properties类: 属性集, 属于Map的双列集合, 继承自Hashtable
    // 构造方法 Properties(): 创建一个Properties集合
    // 特有成员方法
    Object setProperty(String key, String value): 保存/替换键值对
    String getProperty(String key): 通过键获取值. 键不存在返回null
    Set<String> stringPropertyNames(): 返回键的集合
    void store(OutputStream out, String comments): 将集合用字节流写入文件(不能中文),并写入注释
    void store(Writer writer, String comments): 将集合用字符流写入文件(可以中文),并写入注释
    void load(InputStream inStream): 从配置文件中通过字节流加载数据到Properties集合(不能中文)
    void load(Reader reader): 从配置文件中通过字符流加载数据到Properties集合(可以中文)

0 个回复

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