黑马程序员技术交流社区
标题: 【石家庄校区】IO流 [打印本页]
作者: 李皓321 时间: 2018-4-23 15:45
标题: 【石家庄校区】IO流
本帖最后由 小石姐姐 于 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 # 字符打印流
标准输入输出流概述:
静态成员变量。
是PrintStream, OutputStream 的子类, 属于字节输出流
是 InputStream 类, 属于字节输入流. InputStream in =
System.in;
是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:字符打印流,
- 只有输出流 打印就是输出操作
- 自动换行. println() . 会根据系统自动确定换行符
- 自动刷新. 通过构造方法的配置可以实现(只在调用 println() , printf() , format() 时有用)
- 也是包装流, 类似于 BufferedWriter , 自身没有写出功能
- 可以把字节输出流转换为字符输出流
- 不能输出byte字节, 可以输出其他任意类型(要输出字节可以使用PrintStream)
- 关流不会抛出异常(此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常)
对象操作流概述:
构造方法
ObjectInputStream(InputStream in) : 创建对象输入流
成员方法
Object readObject() : 从对象输入流读取对象, 一次只读取一个对象. 当读不到时抛出EOFException .
2,ObjectOutputStream
构造方法
ObjectOutputStream(OutputStream out) : 创建对象输出流
成员方法
void writeObject(Object o) : 将对象写入对象输出流
读写任意类型的对象
- 使用对象输出流写出对象到文件, 则该文件只能使用对象输入流读取对象, 其他流不行
- 只能将实现了 java.io.Serializable 接口的类的对象写入流中, 对象内部有自定义类型的成员变量, 也要实现该接口
序列化: 将对象的信息转换为可存储的信息的过程
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流结合的功能
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 : 本地编码表. 根据系统设置决定编码表
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |