一、文件复制
1、单字节复制
##每次读取的字节都是二进制的低八位;
PS:这种方法复制大文件需要较多的时间。
2、块读写操作
提高每次读写的数据量,减少读写次数,从而提高读写效率(一组字节一次性读写操作)。
- int read(byte[] data):InputStream字节输入流的超类上规定的读块操作,一次性读取给定的字节数组data总长度的字节量并装入到该数组中,返回值为实际读取到的字节数。(如果返回值为整数-1,则表示流已经读取到末尾了)
3、缓存字节流
补充知识:
Java IO中将流分为了两类:节点流和处理流
节点流:也称为低级流,是真实连接我们的程序与另一端的“管道”,是实际负责读写数据的流;
处理流:也称为高级流,不能独立存在,必须连接在其它流上(可以存在多个高级流串连,但它 们的底层一定是低级流)。处理流是为了对“流经”的数据进行某些加工操作,方便简化我 们的工作。
## 可以联想热水器和自来水的关系来理解节点流和处理流的关系。我们需要热水,所以会在自来水“水管”上添加热水器来实现这个目的,而热水器也必须要依存在自来水上才能实现自身的价值,那自来水就是最底层的节点流,热水器则是处理流。
## 实际开发中,我们在IO中会经常串联一组高级流到某个低级流上,使得IO操作以流水线式的对数据加工完成,而这个操作也称为“流的连接”。
缓冲字节流:
java.io.BufferedInputStream和BufferedOutputStream,它们均继承自InputStream和outputStream。它的功能是加快读写效率。
PS:缓冲流内部由一个byte数组,默认长度为8192(8kb),所以本质上缓冲流还是将读写操作转换为块读写进行来保证读写效率的。
二、使用流来读写文本数据
1、使用输出流写出文本数据
UTF编码:Unicode传输编码,里面包含了全世界所有在用的流行文字。(英文是1个字符占1个字节,和ASC部分内容相同;中文1个字符占3个字节)
2、读取文本数据
三、对象序列化
java.io.ObjectInputStream和ObjectOutputStream:这是一对高级流,负责在流连接中进行对象的序列化和反序列化;
- 对象序列化:将一个Java对象按照其结构转换为一组字节的过程;
- 对象反序列化:将一组字节按照其描述还原为一个Java对象的过程;
1、对象序列化
我们将对象输出流连接到文件流上,把一个对象写出时,会经历以下操作:
1、对象先经过对象输出流writeObject(p)
该方法会将对象按照其结果转换为一组字节,而这个过程称为“对象序列化”。
PS:执行writeObject()进行序列化对象时出现异常:“java.io.NotSerializebleException”,这是因 为对象输出流在序列化时,要求序列化的对象必须实现接口“java.io.Serializable”。
2、对象输出流会将序列化后的一组字节再次结果其连接的文件输出流,最终将这组字节写入到文 件中保存(写入磁盘),该经过称为:“数据持久化”。