对象流:
数据流只能实现对基本数据类型和字符串类型的读写,并不能读取对象(字符串除外),如果要对某个对象进行读写操作,则需要对象流。
使用:
ObjectInputStream/ObjectOutputStream是以“对象”为数据源,但是必须将传输的对象进行序列化与反序列化操作。
结果;
序列化和反序列化:
把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。
特点:
[if !supportLists]1) [endif]序列化能保存的元素
[if !supportLists]a) [endif]只能保存对象的非静态成员变量
[if !supportLists]b) [endif]不能保存任何成员方法和静态的成员变量
[if !supportLists]c) [endif]不保存transient成员变量
[if !supportLists]d) [endif]如果一个对象的成员变量是一个对象,这个对象的成员变量也会保存
[if !supportLists]e) [endif]串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存
[if !supportLists]2) [endif]使用对象流把一个对象写到文件时不仅保证该对象是序列化的,而且该对象的成员对象也必须是可序列化的。
[if !supportLists]3) [endif]如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。
对象序列化注意事项
[if !supportLists]1) [endif]同一个对象多次序列化的处理
[if !supportLists]a) [endif]所有保存到磁盘中的对象都有一个序列化编号
序列化一个对象中,首先检查该对象是否已经序列化
文件夹的复制:
涉及流:字节流,字符流
BufferedInputStream,BufferedOutputStream
FileInputStream,FileOutputStream
问题分解
复制一个文件
指定目录下的所有文件
指定目录下的所有文件及子目录下的所有文件
结果:
字节数组流:
ByteArrayInputStream和ByteArrayOutputStream经常用在需要流和数组之间转化的情况!
FileInputStream是把文件当做数据源。ByteArrayInputStream则是把内存中的”某个字节数组对象”当做数据源。
装饰器模式简介:
动态的为一个对象增加新的功能
装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
实现细节:
抽象构件角色 ICar
具体的构件角色Car
装饰器角色 SuperCar
具体的装饰器角色FlyCar、WaterCar、AICar
优点:
[if !supportLists]1) [endif]扩展对象功能,比继承灵活,不会导致类个数急剧增加
[if !supportLists]2) [endif]可以对一个对象进行多次装饰,创建出不同行为的组合,得到功能更加大的对象
[if !supportLists]3) [endif]具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类
缺点
[if !supportLists]1) [endif]产生很多小对象。大量小对象占据内存,一定程序上影响性能
[if !supportLists]2) [endif]装饰模式易于出错,调试排查比较麻烦
IO流实现细节
(1)抽象构件角色 InputStream,OutputStream,Reader,Writer
(2)具体构件角色 FileInputStream,FileOutputStream
(3)装饰器角色 FilterInputStream,FilterOutputStream
持有一个抽象构件的引用
(4)具体装饰角色
BufferedInputStream,BufferedOutputStream等
IO流体系总结:
Apache IOUtils的使用_Apache FileUtils的使用:
Commons IO是apache的一个开源的工具包,封装了IO操作的相关类,使用Commons
IO可以很方便的读写文件,
1IOUtils:IOUtils则是提供了读写文件的方法
IOUtils工具类操作的相关方法
(1)String IOUtils.toString(InputStream input)传入输入流对象返回字符串
FileUtils中提供了许多设计文件操作的 已封装好的方法。
FileUtils工具类操作的相关方法
(1)StringFileUtils.readFileToString(File file,String encoding)
FileUtils.writeStringToFile(File file,Stringdata,String encoding)读写文件
(2)FileUtils.copyFile(FilesrcFile,File destFile)复制文件
(3)FileUtils.copyURLToFile(URLsource,File destination)复制url对象到指定文件