第29次(IO流)
学习主题:IO流
学习目标:
1 掌握序列化和反序列化
2 掌握装饰器模式
- 对象流
- 为什么需要序列化?
序列化以后的对象可以保存到磁盘上,也可以在网络上传输,使得不同的计算机可以共享对象。(序列化的字节序列是与平台无关的)。
- 对象的序列化有哪些条件?
只有实现了Serializable接口的类的对象才可以被序列化。Serializable接口中没有任何的方法,实现该接口的类不需要实现额外的方法。
如果对象的属性是对象,属性对应类也必须实现Serializable接口
- 序列化和反列序列化
- 简述序列化与反序列化的内容?
- 序列化能保存的元素
- 只能保存对象的非静态成员变量
- 不能保存任何成员方法和静态的成员变量
- 不能保存transient成员变量
- 如果一个对象的成员变量是一个对象,这个对象的成员变量也会保存
- 串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存
- 使用对象流把一个对象写到文件时不仅保证该对象是序列化的,而且该对象的成员对象也必须是可序列化的。
- 如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记transient,那么对象仍然可以序列化。
- 对象序列化的注意事项有哪些?
- 同一个对象多次序列化的处理
- 所有保存到磁盘中的对象都有一个序列化编号
- 序列化一个对象中,首先检查该对象是否已经序列化过
- 如果没有,进行序列化
- 如果已经序列化,将不再重新序列化,而是输出编号即可
- 如果不希望某些属性(敏感)序列化,或不希望出现递归序列
- 为属性添加transient关键字(完成排除在序列化之外)
- 自定义序列化(不仅可以决定哪些属性不参与序列化,还可以定义属性具体如何序列化)
- 序列化版本不兼容
- 修改了实例属性后,会影响版本号,从而导致反序列化不成功
- 解决方案:为Java对象指定序列化版本号serialVersionUID
- 文件夹的复制
- 文件夹的复制会使用到哪些流?
BufferedInputStream、BufferedOutputStream
FileInputStream、FileOutputStream
-
- 简述文件夹复制的过程?
- 指定要复制的文件夹目录和要复制的目标目录
- 遍历源文件夹下的所有文件/目录
- 遍历到的如果是文件,将该文件复制到目标目录下,如果是目录,将该子目录作为源文件夹,目标目录下创建与该子目录同名的目录作为目标目录,执行第二步。
- 遍历结束。
- 字节数组流
- 字节数组流的作用?
在网络上两台计算机进行互相交流通信的时候,传递的就是字节。用字节数组流可以将各种数据类型转为byte类型。
- 设计模式_装饰器模式
- 什么是装饰设计模式?举例描述
职责:动态的为一个对象增加新的功能
装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
根据需求,为Car添加新功能:
![70d9d2c7724d25b3a989f945e1987c5c.png](https://i-blog.csdnimg.cn/blog_migrate/9bbf5b7e6919c5e34b9ed1134b6daebf.jpeg)
-
- 装饰模式的实现细节及优缺点?
实现细节:
- 抽象构件角色 ICar
- 具体的构件角色 Car
- 装饰器角色 SuperCar
- 具体的装饰器角色 FlyCar、WaterCar、AICar
优点:
- 扩展对象功能,比继承灵活,不会导致类个数急剧增加
- 可以对一个对象进行多次装饰,创建出不同行为的组合,得到功能更加强大的对象
- 具体构建类和具体装饰类可以独立变化,用户可以根据自己需要自己增加新的具体构件子类和具体装饰子类
缺点:
- 产生很多小对象。大量小对象占据内存,一定程度上影响性能
- 装饰模式易于出错,调试排查比较麻烦
第30次(IO流总结和线程初步)
学习主题:IO流总结和线程初步
学习目标:
1 掌握IO流的使用
2 掌握IOUtils和 FileUtils工具类的使用
3 掌握线程初步知识
- IO体系总结
- 画出IO体系结构图
![5df81f5ed0b3c32a4a506fb04b378d19.png](https://i-blog.csdnimg.cn/blog_migrate/c1c0cfb8c90e8fe0cc6900da6de24b44.jpeg)
![d275f445fb8dbac06f7da64e6eaf14a7.png](https://i-blog.csdnimg.cn/blog_migrate/21b9fc515f2a7705efcf6aa605bb279d.png)
- 请你例举出IO流中的处理流和节点流?
处理流:
缓冲流 BuferedInputStream、BufferedOutStream、BufferedReader、BufferedWriter
打印流 PrintStream、PrintWriter
对象流 ObjectInputStream、ObjectOutputStream
转换流 InputStreamReader、OutputStreamReader
节点流L:
文件流 FileInputStream、FileOutputStream、FileReader、FileWriter
字节数组流 ByteArrayInputStream、ByteArrayOutputStream
- Apache IOUtils的使用_Apache FileUtils的使用
- Commons IO的的作用是什么?
Commons IO是apache的一个开源的工具包,封装了IO操作的相关类,使用CommonsIO可以很方便的读写文件,
- FileUtils中提供了许多涉及文件操作的已封装好的方法。
- IOUtils则是提供了读写文件的方法
- IOUtils和FileUtils中有哪些常用的方法?分别代表什么意思?
IOUtils:
- toString(InputStream ) 读取文件内容
- write(String,OutputStream) 写数据
- copy(InputStream, OutputStream) 复制文件中的内容
FileUtils:
- openInputStream(File) 获取FileInputStream类型的对象
- toFile(URL) 将URL转为File
- copyFileToDirectory(File,File) 将文件拷贝到指定目录
- copyFile(File, File) 拷贝文件
- copyURLToFile(URL, File) 将提供的URL地址里的数据拷贝到文件
- readFileToString(File) 读取文件内容,得到String类型
- writeStringToFile(File, String) 将字符串写入文件
- 多线程基本概念_程序_进程_线程
- 什么是程序、进程和线程?
程序:是一个指令的集合
进程:(正在执行的程序)是一个静态的概念
进程是程序的一次静态执行过程,占用特定的空间。
每个进程都是独立的,由3部分组成cpu、data、code
线程:是进程中一个“单一的连续控制流程 ”/执行路径线程又被称为轻量级进程
- 进程与线程之间区别?
区别
进程
线程
根本区别
作为资源分配的单位
调度和执行的单位
开销
每个进程都有独立的代码和数据空间(进程上下文),进程空间的切换会有较大的开销。
线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
所处环境
在操作系统中能同时运行多个任务(程序)
在同一应用程序中有多个顺序流同时执行
分配内存
系统在运行的时候会为每个进程分配不同的内存区域
除了CPU之外,不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源
- 通过继承Thread类实现多线程
- 简述通过继承Thread类实现多线程的步骤?
- 继承Thread类
- 重写run()方法
- 通过start()方法启动线程
- 继承Thread类实现多线程的缺点是什么?
java中的类是单继承的,一旦继承了Thread类,就不允许再去继承其他的类。
- 通过实现接口Runnable实现多线程
- 简述使用Runnable接口实现多线程的步骤?
- 编写类实现Runnable接口
- 实现run()方法
- 通过Thread类的start()方法启动线程
- 简述代理设计模式?
代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象
- 线程状态
- 线程有哪几种状态?
- 新生状态
- 就绪状态
- 运行状态
- 阻塞状态
- 终止状态/死亡状态
- 请你画出线程的生命周期图
![bc99b7fb2e7d9c1f37da1f5da1d66f45.png](https://i-blog.csdnimg.cn/blog_migrate/f334a8ec6d468259f8d869db08d0d98f.png)