一、序列化和反序列化:
1.对象流:
能够对对象进行读写操作的处理流。
(1)ObjectInputStream(Object输出流):
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
构造方法:
1)ObjectInputStream():为完全重新实现 ObjectInputStream 的子类提供一种方式,让它不必分配仅由 ObjectInputStream 的实现使用的私有数据。
2) ObjectInputStream(InputStream in):创建从指定 InputStream 读取的 ObjectInputStream。
常用方法:
1)readInt(): 读取一个 32 位的 int 值。
2)readObject():从 ObjectInputStream 读取对象。
3)readDouble():读取一个 64 位的 double 值。
4)readBoolean(): 读取一个 boolean 值。
5)close():关闭输入流。
(2)ObjectOutputStream(Object输入流):
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。
构造方法:
1)ObjectOutputStream():为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。
2)ObjectOutputStream(OutputStream out) : 创建写入指定 OutputStream 的 ObjectOutputStream。
常用方法:
1)writeObject(Object obj):将指定的对象写入 ObjectOutputStream。
2)writeUTF(String str):以 UTF-8 修改版格式写入此 String 的基本数据
3)flush():刷新该流的缓冲。
4)close(): 关闭流。
2.序列化:
ObjectOutputStream --->序列化 --->写对象 , 将对象以 “二进制/字节”的形式写到文件。
(1)实现序列化:
1)创建 ObjectOutputStream 对象;
2)调用 writeObject()输出对象。
(2)实现序列化的条件:
1)只有实现了 Serializable 接口的类的对象才可以被序列化。
2)如果对象的属性是对象,属性对应类也必须实现 Serializable接口。
(3)注意:
1)static属性不参与序列化。
2)对象中的某些属性如果不想被序列化,不能使用static,而是使用transient修饰。
3)为了防止读和写的序列化ID不一致,一般指定一个固定的序列化ID。
3.反序列化:
ObjectInputStream---->反序列化---->读对象。
1)创建 ObjectInputStream 对象;
2)调用 readObject()读取对象;
4.文件夹的复制:
(1)文件夹复制:
1)复制文件夹使用递归。
2)文件的复制。
(2)实现过程:
创建文件复制的方法:
1) 创建输入流;
2) 创建输出流;
3) 创建缓存区;
4) 关闭流;
创建文件夹复制的方法:
1) 判断目标文件夹是否存在,如果不存在创建文件夹;
2) 获取源目录中的子文件和子文件夹及名字;
3) 对获取的子文件和文件进行判断;
4) 如果是文件调用文件复制的方法;
5) 如果是文件夹则使用递归继续执行复制文件夹的方法;
二、IOUtils和FileUtils
Commons IO 是 是 apache 的一个开源的工具包, 封装了 IO操作的相关类, 使用 Commons IO 可以很方便的读写文件。
1.IOUtils:
IOUtils 则是提供了读写文件的方法。
常用方法:
1)String IOUtils.toString(InputStream input):传入输入流对象返回字符串;
2) readLine方法:读入输入流内容中的一行。
3) toString:将输入流或数组中的内容转化为字符串。
4)writeLine方法:向流里面写入一行内容。
2.FileUtils:
FileUtils 中提供了许多设计文件操作的 已封装好的方法。
常用方法:
1)FileUtils.copyFile(File srcFile,File destFile)复制文件。
2) copyDirectory:将一个目录内容拷贝到另一个目录。可以通过FileFilter过滤需要拷贝的文件。
3)FileUtils.copyURLToFile(URL source,File destination)复制url 对象到指定文件。
4) readlines方法:将文件内容按行返回到一个字符串数组中。
三、设计模式_装饰器模式:
1.装饰器模式:
装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
(1)优点:
1) 扩展对象功能,比继承灵活,不会导致类个数急剧增加;
2) 可以对一个对象进行多次装饰,创建出不同行为的组合,得到功能更加大的对象。
3) 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类。
(2)缺点:
1) 产生很多小对象。大量小对象占据内存,一定程序上影响性能。
2) 装饰模式易于出错,调试排查比较麻烦。
四、IO体系总结:
1.按流的方向分类:
1) 输入流:数据源到程序(InputStream、Reader读进来)。
2) 输出流:程序到目的地(OutPutStream、Writer写出去)。
2. 按流的处理数据单元分类:
1)字节流:按照字节读取数据(InputStream、OutputStream)。
2) 字符流:按照字符读取数据(Reader、Writer)。
3. 按流的功能分类:
1) 节点流:可以直接从数据源或目的地读写数据。
2) 处理流:不直接连接到数据源或目的地,是处理流的流。通过对其他流的处理提高程序的性能。
4.IO流体系:
(1) 字节流 :InputStream,OutputStream;
(2)字符流:Reader ,Writer;
(3)数据流:DataInputStream,DataOutputStream;
(4)对象流:ObjectInputStream,ObjectOutputStream;
(5)缓冲流:BufferedInputStream,BufferedOutputStream / BufferedReader,BufferedWriter;
(6) 转换流:InputStreamReader,OutputStreamWriter;
(7) 数组流:ByteArrayInputStream,ByteArrayOutputStream;
(8)打印流:PrintStream,PrintWriter;