IO流使用技巧

IO流分为
字符流 能操作所有类型的文件 但中文会出现乱码
FileOutputStream 字符输出流 是将数据从内存传输到硬盘的
方法 write();写数据
一次可以写一个字节,或一个字节数据,或字节数据其中的部分数据

close(); 释放资源 关闭流。
创建 new FileOutputStream(字符串类型 文件路径名);

FileInputStream 字符输入流 是将数据从硬盘传输到内存的
方法 read();读数据
返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
输入流的结尾已经到达,则为-1
一次可以读一个字节,或一个字节数据,或字节数据其中的部分数据

创建 new FileInputStream(字符串类型 文件路径名);

字节缓冲输出流
BufferedOutputSream; 设置缓冲流,应用程序可以向底层输出流写入字节,这样就不回去调用底层,节约底层资源减少对底层系统的调用

字节缓冲输入流
BufferedInputStream; 他会在内部创建缓冲区数组,当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。提高数据读取效率。

创建字节缓冲流
new BufferedOutputSream(new FileOutputSream(String类型 的 文件路径名))
缓冲字节输出流

new BufferedInputSream(new FileInputSream(String类型 的 文件路径名))
缓冲字节输入流

字符流 他底层是 字节流+字符集
FileWrite 字符输出流 FileRead 字符输入流
创建格式
new FileWriter(String类型 的 文件路径名,也可以通过 new File()创建)存数据的
写数据 writer();
一次可以写 一个字符 、一个字符数组,字符数组中的一部分
也可以是 一个字符串、一个字符串中的一部分
void write(char[] cbuf, int off, int len)

new FileRead(String类型 的 文件路径名,也可以通过 new File()创建)不存数据的
read();读数据结果包含行的内容的字符串,不包括任何行终止字符输入流的结尾已经到达,则为-1
一次可以读 一个字符 、一个字符数组,字符数组中的一部分
int read(char[] cbuf);

flush();涮新数据,刷新后还可以写数据
close();关闭流

字符缓冲流
BufferedWriter 字符缓冲输出流
创建格式 new BufferedWriter(new FileWriter(”文件路径名”));
文件路径名存在就写入,不存在就创建新的文件写入保存

BufferedRead 字符缓冲纯输入流
创建格式 new BufferedRead(new FileRead(“文件路径名”)
文件存在就读取,不存在就不读

  • BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途

  • BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途

字符缓冲流特殊功能
void newLine(); 写数据时的换行 bw.newLine();
String readline(); 一次读一行文字,结果包含行的内容的字符串,不包括任何行终止字符输入流的结尾已经到达,则为null

转换流 作用 -----------》字符流中和编码解码问题

InputStreamReader(InputStream in)
使用默认字符编码创建InputStreamReader对象

InputStreamReader(InputStream in,String chatset)
使用指定的字符编码创建InputStreamReader对象

OutputStreamWriter(OutputStream out)
使用默认字符编码创建OutputStreamWriter对象

OutputStreamWriter(OutputStream out,String charset)
使用指定的字符编码创建OutputStreamWriter对象

  • InputStreamReader:是从字节流到字符流的桥梁,父类是Reader
    它读取字节,并使用指定的编码将其解码为字符
    它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

  • OutputStreamWriter:是从字符流到字节流的桥梁,父类是Writer
    是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
    它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

字符集 ---------》 是一个系统支持的所有字符的集合
常见的字符集
ASCII字符集:
GBXXX字符集:GBK:最常用的中文码表。
Unicode字符集:UTF-8编码:可以用来表示Unicode标准中任意字符

lASCII:是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)
基本的ASCII字符集,使用7位表示一个字符,共128字符。ASCII的扩展字符集使用8位表示一个字符,共256字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等

GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等

UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用 中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四个字节为每个字符编码

对象操作流 分为 : 对象序列化流 与 对象反序列化流
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
对象反序列化流:该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化

对象序列化流—>输出
new ObjectOutputStream(new FileOutputStream(“文件路径名”))
写数据方法 writerObject(Object obj);将指定的对象写入ObjectOutputStream
这里参数是Object类型 所以要在 对象反序列化流 读出数据后 进行输出打印时 记得强转数据类型

对象反序列化流 -------> 输入
new ObjectInputStream(new FileInputStream("文件路径名“)
读数据 方法 Object readObject(Object obj), 从ObjectInputStream读取一个对象
这里参数是Object类型 所以要在 对象反序列化流 读出数据后 进行输出打印时 记得强转数据类型

- serialVersionUID关键字

  • 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?
    • 会出问题,会抛出InvalidClassException异常
  • 如果出问题了,如何解决呢?
    • 重新序列化
    • 给对象所属的类加一个serialVersionUID
      • private static final long serialVersionUID = 42L;

- transient关键字

  • 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
    • 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程

Properties集合 它是一个Map体系的集合类
Properties 可以保存到流中 或从流中加载
Properties 属性列表中的每个键及其对应的值都是一个字符串

Properties方法

Object setProperty(String key, String value)
设置集合的键和值,都是String类型,底层调用 Hashtable方法 put

String getProperty(String key)使用此属性列表中指定的键搜索属性

Set stringPropertyNames()从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串

和IO流结合的方法
void load(Reader reader)
从输入字符流读取属性列表(键和元素对)

void store(Writer writer, String comments)
将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流

在Properties文件中手动写上姓名和年龄,读取到集合中,将该数据封装成对象,写到本地文件

//1.创建Properties集合,将本地文件中的数据加载到集合中
    Properties prop = new Properties();
    FileReader fr = new FileReader("prop.properties");
    prop.load(fr);
    fr.close();
	//2.获取集合中的键值对数据,封装到学生对象中
    String name = prop.getProperty("name");
    int age = Integer.parseInt(prop.getProperty("age"));
    Student s = new Student(name,age);
	//3.创建序列化流对象,将学生对象序列化到本地文件中
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
    oos.writeObject(s);
    oos.close();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普希托夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值