JavaSE:核心类库 (二) 学习笔记
一. 索引
1. 异常机制
<1> 异常的基本概念: https://www.cnblogs.com/JasperZhao/p/14857862.html
<2> 异常的避免与捕获: https://www.cnblogs.com/JasperZhao/p/14858766.html
<3> finally的使用: https://www.cnblogs.com/JasperZhao/p/14859366.html
<4> 异常的抛出: https://www.cnblogs.com/JasperZhao/p/14862411.html
<5> 自定义异常: https://www.cnblogs.com/JasperZhao/p/14865733.html
2. File类
<1> File类: https://www.cnblogs.com/JasperZhao/p/14866444.html
3. IO流
<1> IO流的概念: https://www.cnblogs.com/JasperZhao/p/14866571.html
<2> FileWriter类 & FileReader类: https://www.cnblogs.com/JasperZhao/p/14866634.html
<3> FileOutputStream类 & FileInputSteam类: https://www.cnblogs.com/JasperZhao/p/14867467.html
<4> BufferedOutputStream类 和 BufferedInputStream类: https://www.cnblogs.com/JasperZhao/p/14867583.html
<5> BufferedWriter类 和 BufferedReader类: https://www.cnblogs.com/JasperZhao/p/14867678.html
<6> PrintStream类 和 PrintWriter类: https://www.cnblogs.com/JasperZhao/p/14869680.html
<7> OutputStreamWriter类 和 InputStreamReader类: https://www.cnblogs.com/JasperZhao/p/14869726.html
<8> 字符编码: https://www.cnblogs.com/JasperZhao/p/14869785.html
<9> DataOutputStream 类 和 DataInputStream 类: https://www.cnblogs.com/JasperZhao/p/14869844.html
<10> ObjectOutputStream 类 和 ObjectInputStream 类: https://www.cnblogs.com/JasperZhao/p/14869960.html
<11> RandomAccessFile 类: https://www.cnblogs.com/JasperZhao/p/14870050.html
4. 多线程
<1> 程序 / 进程 / 线程 的概念: https://www.cnblogs.com/JasperZhao/p/14874037.html
<2> 线程的创建: https://www.cnblogs.com/JasperZhao/p/14874444.html
<3> 线程的生命周期: https://www.cnblogs.com/JasperZhao/p/14874557.html
<4> 与线程的编号和名称有关的方法: https://www.cnblogs.com/JasperZhao/p/14889919.html
<5> 与线程有关的常用方法: https://www.cnblogs.com/JasperZhao/p/14891998.html
<6> 线程同步机制: https://www.cnblogs.com/JasperZhao/p/14892192.html
<7> 线程 - 静态方法的锁定: https://www.cnblogs.com/JasperZhao/p/14893757.html
<8> 线程安全类和不安全类: https://www.cnblogs.com/JasperZhao/p/14893795.html
<9> 线程 - 死锁的概念: https://www.cnblogs.com/JasperZhao/p/14893842.html
<10> 使用Lock(锁)实现线程同步: https://www.cnblogs.com/JasperZhao/p/14894036.html
<11> Object类中与线程有关的常用方法: https://www.cnblogs.com/JasperZhao/p/14894096.html
<12> 线程池: https://www.cnblogs.com/JasperZhao/p/14894261.html
<13> 线程 - 生产者与消费者模型: https://www.cnblogs.com/JasperZhao/p/14913002.html
5. 网络编程
<1> 有关网络编程的常识: https://www.cnblogs.com/JasperZhao/p/14874592.html
<2> 和网络相关的协议: https://www.cnblogs.com/JasperZhao/p/14875015.html
<3> 基于TCP协议的编程模型: https://www.cnblogs.com/JasperZhao/p/14875334.html
<4> TCP相关的ServerSocket类 和 Socket类: https://www.cnblogs.com/JasperZhao/p/14884855.html
<5> 基于UDP协议的编程模型: https://www.cnblogs.com/JasperZhao/p/14884999.html
<6> URL类 / URLConnection类: https://www.cnblogs.com/JasperZhao/p/14886166.html
6. 反射机制
<1> 反射机制的基本概念: https://www.cnblogs.com/JasperZhao/p/14887957.html
<2> 反射机制 - Class类: https://www.cnblogs.com/JasperZhao/p/14888037.html
<3> 反射机制 - Constructor类: https://www.cnblogs.com/JasperZhao/p/14888264.html
<4> 反射机制 - Field类: https://www.cnblogs.com/JasperZhao/p/14888721.html
<5> 反射机制 - Method类: https://www.cnblogs.com/JasperZhao/p/14888982.html
<6> 反射机制 - 获取其他结构信息: https://www.cnblogs.com/JasperZhao/p/14889007.html
二. 练习题
1. 下面方法调用后的输出结果是什么?
int show(){ int x = 1; try{ return ++x; }catch(Exception e){ }finally{ ++x; } return x; }
答案:2
分析: try{} 与 finally{} 中的 ++x 表达式,相互独立,在内存中各自占有一块独立的内存空间。 return 语句返回的是 try中的表达式 ++x,即为2
2. 已知,InputStream类中的read()和read(byte[] data),在读取到文件末尾时,会返回-1。
如果,文件中的数据内容恰好是-1时,应该如何处理?
答:不存在数据内容是 -1 (数值)的情况
原因: read() 用于读取单个字节,并且返回值类型为int类型。
-1 由字节(byte类型)转换为 int类型时,数值不等同于 -1
3. 简述synchronized关键字 和 volatile关键字的主要区别
<1>volatile, adj, 易变的
使用volatile关键字修饰一个变量时,意味着这个变量的值是易变的,便于这个数据在内存和缓存中的同步,以实现线程同步
<2>vlolatile关键字用于实现线程的轻量同步,比 synchronized关键字 性能更佳
vlolatile关键字修饰变量,而synchronized关键字修饰代码块 / 方法
三. 编程题
1.
a. 使用List集合,实现简易的学生信息管理系统,要求打印字符界面,提示用户选择相应的功能,根据用户输入的选择,
去实现增加、删除、修改、查找,以及遍历所有学生信息的功能
b. 自定义学号异常类 和 年龄异常类,并在该成员变量不合理时,产生异常对象,并抛出
c. 当系统退出时,将List集合中所有学生信息,写入到文件中。
当系统启动时,读取文件中所有学生信息,到List集合中
思路:
a.
<1> switch...case结构:根据用户输入的选择,实现增删改查,以及遍历打印的功能
<2> 注意代码的分层:
字符界面 --> Client.java
功能处理 --> Server.java,包含五个成员方法(add,delete,set,get,print)
<3> 把储存学生信息的集合,定义为Server.java中的一个成员变量:便于对其进行增删改查操作
<4> 在Client.java中,声明一个Server类型的引用:便于从Client.java中,调用Server.java中的方法 (体现了合成复用原则)
<5> 图解
b.
<1> 在Server.java中:
if (年龄 / 学号 数值不合理) {
throw new 对应的Exception();
}else{
List.add(年龄 / 学号)
}
<2> 自定义 IdException.java 和 AgeException.java (继承Exception),
提供 无参构造 和 以字符串为参数的 构造方法
c.
<1> 创建Database.java,用于实现学生信息的读、写功能
<2> 故,需要两个方法read() 和 write()
<3> 准备一个类型为List集合的成员变量,把集合当作对象,使用ObjectOutputStream,将对象整体写入到文件中
使用ObjectInputStream,使用readObject一次性地将文件读取到集合中
<4> 为了保持Server.java 和 Database.java 中集合 ( studentList ) 的公用,
需要在测试类中定义一个集合,通过构造方法 ( new Server(List) & new Database(List) ),
分别传入到Server 和 Database 中
2.
a. 使用线程池,将一个目录中的所有内容,拷贝到另外一个目录中,包含子目录中的内容
b. 实现将指定目录中的所有内容删除,包含子目录中的内容(都要全部删除)
思路:
a. 可以分为三步:
<1> 将一个目录中的所有内容拷贝到另外一个目录
创建拷贝方法,通过for...each遍历调用拷贝方法,将所有文件进行拷贝
<2> 子目录中的内容的拷贝
在拷贝方法中:
if ( 是子目录) {
递归
}
if (是文件){
采用匿名内部类的方式, 调用线程池的run()方法,来实现拷贝
}
<3> 使用线程池
创建一个ExecutorService类型的引用,在线程池的run()方法中,来调用copy()方法
b.
与题目 “遍历指定目录以及子目录中的所有内容并打印出来” 相似:
https://www.cnblogs.com/JasperZhao/p/14866444.html
3.
使用基于tcp协议的编程模型,实现多人同时在线聊天。
要求:<1> 每个客户端,将发送的聊天内容发送到服务器;
<2> 服务器接收到后,转发给当前所有在线的客户端
思路: <1>
与案例题目相同:https://www.cnblogs.com/JasperZhao/p/14884855.html
<2>
传发给所有客户端 ---->
建立当前在线的所有客户端的输出流 --->
需要知道所有客户端的Socket (端点) --->
需要调用accept()方法 (accept():等待客户端的连接请求,并返回一个与客户端通信的Socket) --->
需要得到accept()方法的所有返回值 --> 使用List集合来储存accept()方法的所有返回值
<3> 子线程:负责接收消息
主线程:负责发送消息
4.
备注:控制台需要打印出程序的执行流程和最后结果,第二题不可忽略,将正在复制和正在删除的文件名字打印到控制台中