序列化和反序列化,进程和线程

学习主题:IO流
学习目标:
1 掌握序列化和反序列化
2 掌握装饰器模式

1.对象流
(1)为什么需要序列化?
序列化以后的对象可以保存到磁盘上,也可以在网络上传输,使得不同的计算机可以共享对象(序列化的字节序列是与平台无关的)。
(2)对象的序列化有哪些条件?
只有实现了Serializable接口对的类的对象才可以被序列化。Serializable接口中没有任何的方法,实现该接口的类不需要实现额外的方法。

2.序列化和反列序列化
(1)简述序列化与反序列化的内容?
1、序列化能保存的元素 (属性的序列化和方法无关)
a) 只能保存对象的非静态成员变量
b)不能保存任何成员方法和静态的成员变量
c) 不保存 transient 成员变量
d)如果一个对象的成员变量是一个对象,这个对象的成 员变量也会保存
e) 串行化保存的只是变量的值,对于变量的任何修饰符, 都不能保存
2、使用对象流把一个对象写到文件时不仅保证该对象是序列化的,而且该对象的成员对象也必须是可序列化的。

3、如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个 NotSerializableException。我们可以将这个引用标记为 transient,那么对象仍然可以序列化。
(2)对象序列化的注意事项有哪些?
1、同一个对象多次序列化的处理
a)所有保存到磁盘中的对象都要一个序列化的编号
b)序列化一个对象中,首先检查该对象是否已经序列化过
c)如果没有,进行序列化
d)如果已经序列化,将不再重新序列化,而是输出编号即可。
2、如果不希望某些属性(敏感)序列化,或不希望出现递归序列
a)为属性添加transient关键字(完成排除在序列化之外)
b)自定义序列化(不仅可以决定哪些属性不参与序列化,还可以定 义属性具体如何序列化)
3、序列化版本不兼容
a)修改了实例属性后,会影响版本号,从而导致反序列不成功
b)解决方案:为Java对象指定序列化版本号serialVersionUID

3.文件夹的复制
(1)文件夹的复制会使用到哪些流?
字节流,字符流,BufferedInputStream ,BufferedOutputStream , FileInputStream ,FileOutputStream
(2)简述文件夹复制的过程?
public class TestCopy {
public static void main(String[] args) {
/*File srcFile = new File(“D:\crack\install.txt”);
File targetFile = new File(“E:\install.txt”);
copyFile(srcFile, targetFile); */

	File srcDir = new File("D:\\crack");
	File targetDir = new File("E:\\crack");
	copyDir(srcDir, targetDir);
}

public static void copyDir(File srcDir,File targetDir){
	if(!targetDir.exists()){
		targetDir.mkdir(); //如果目的地文件目录不存在,则创建目录
	}
	File[] files=srcDir.listFiles();//获取源目录下的所有文件
	for(File file:files){
		if(file.isFile()){
			//复制 srcDir --> 
			copyFile(new File(srcDir+"\\"+file.getName()), new File(targetDir+"\\"+file.getName()));
		}else{
		}
	}
}
public static void copyFile(File srcFile,File targetFile){
	//提高读取效率,从数据源
	BufferedInputStream bis=null;
	//提高写入效率,到目的地
	BufferedOutputStream bos=null;
	try {
		bis = new BufferedInputStream(new FileInputStream(srcFile));
		bos = new BufferedOutputStream(new FileOutputStream(targetFile));
		//边读边写
		byte[] by = new byte[1024];
		int len=0;
		while((len=bis.read(by))!=-1){
			bos.write(by,0,len);
		}
	} catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally{
		//关闭
		if(bos!=null){
			try {
				bos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(bis!=null){
			try {
				bis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
} 

4.字节数组流
(1)字节数组流的作用?
将各种数据类型转为byte数据类型,方便网络通信

5.设计模式_装饰器模式
(1)什么是装饰设计模式?举例描述
装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能,使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
(2)装饰模式的实现细节及优缺点?
实现细节:
1、抽象构件角色 ICar
2、具体的构件角色 Car
3、装饰器角色 SuperCar
4、具体的装饰器角色 FlyCar ,WaterCar ,AICar
优点:
1、扩展对象功能,比继承灵活,不会导致类个数急剧增加
2、可以对一个对象进行多从装饰,创建出不同行为的组合,得到功能更加大的对象
3、具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类
缺点:
1、产生很多小对象,大量小对象占据内存,一定程序上影响性能
2、装饰模式抑郁出错,调试排查比较麻烦
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。

学习主题:IO流总结和线程初步
学习目标:
1 掌握IO流的使用
2 掌握IOUtils和 FileUtils工具类的使用
3 掌握线程初步知识

6.IO体系总结
(1)画出IO体系结构图

在这里插入图片描述

在这里插入图片描述

(2)请你例举出IO流中的处理流和节点流?
处理流:BufferedInputStream ,BufferedOutputStream ,BufferedReader ,
BufferedWriter ,
InputStreamReader ,OutputStreamWriter ,DataInputStream ,
DataOutputStream
节点流:FileInputStream ,FileOutputStream ,ByteArrayInputStream ,
ByteArrayOutputStream ,

7.Apache IOUtils的使用_Apache FileUtils的使用
(1)Commons IO的的作用是什么?
Commons IO是apache的一个开源的工具包,封装了IO操作的相关类,使用Commons IO可以很方便的读写文件。
(2)IOUtils和FileUtils中有哪些常用的方法?分别代表什么意思?
1、closeQuietly——这些关闭一个流的方法将忽略nulls和例外的情况。
2、toXxx /read-这些方法从一个流读取数据。
3、 write这些方法将数据写到一个流里。
4、copy——这些方法用于从一个流的所有的数据复制到另一个流。
5、contentEquals——这些方法用于比较两个流的内容。

8.多线程基本概念_程序_进程_线程
(1)什么是程序、进程和线程?
程序:指令的集合,静态的。
进程:运行的程序,程序的一次执行。
线程:进程中的一条完整的执行的路径。 进程中的一条任务线。
(2)进程与线程之间区别?
进程特点:
多个进程可以并发执行。
进程是系统进行资源分配的最小单位。多个进程之间不共享自己的资源。
进程中至少要包含一个线程,可以有多个线程。如果进程中没有存活的线程。该进程就会被jvm杀死。
进程中的第一线程,一般称为主线程。
线程特点:
线程可以并发执行。
线程不能独立存在,必须依赖于某个进程存在。
程序中的所有的代码的执行,都是依赖与线程的。
线程是cpu进行调度执行的基本单元。
可以形象的理解为,所有的进程中的线程都在抢夺cpu的使用权。
多个线程可以共享所在的进程中的资源。
Java 程序中的第一线程称为 main 线程 。主线程。

9.通过继承Thread类实现多线程
(1)简述通过继承Thread类实现多线程的步骤?

  1. 在Java中负责实现线程功能的类是java.lang.Thread 类。
  2. 可以通过创建 Thread的实例来创建新的线程。
  3. 每个线程都是通过某个特定的Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
  4. 通过调用Thread类的start()方法来启动一个线程。

(2)继承Thread类实现多线程的缺点是什么?
继承java.lang.Thread,重写run 方法。优点:简单、好理解。缺点:不能再继承其他的类,多个线程共享同一个资源实现相对复杂。

10.通过实现接口Runnable实现多线程
(1)简述使用Runnable接口实现多线程的步骤?
1、编写实现Runnable接口
2、实现run()方法
3、通过Thread类的start()方法启动线程
(2)简述代理设计模式?
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
11.线程状态
(1)线程有哪几种状态?
在这里插入图片描述
(2)请你画出线程的生命周期图
在这里插入图片描述
分享/讲解/扩展思考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值