20155233 2016-2017-2 《Java程序设计》第6周学习总结
学习目标
- 理解流与IO
- 理解InputStream/OutPutStream的继承架构
- 理解Reader/Writer继承架构
- 会使用装饰类
- 会使用多线程进行并发程序设计
教材学习内容总结
本周主要进行第十章和第十一章的学习。
第十章
Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象。
从应用程序角度来看,如果要将数据从来源取出,可以使用输入串流(java.io.InputStream 实例),如果要将数据写入目的地,可以使用输出串流(java.io.OutputStream 实例)
在不使用InputStream与OutputStream时,必须使用close()方法关闭串流。由于InputStream与OutputStrem操作了java.io.Closeable接口,其父接口为java.lang.AutoCloseable接口。
InputStream、OutStream提供串流基本操作,如果想要为输入/输出的数据做加工处理,则可以使用打包器类。常用的打包器具备缓冲区作用的BufferedOutputStream、BufferedInputStream,具备数据转换处理的DataInputStream、DataOutputStream,具备对象串行化能力的ObjectInputStream、ObjectOutputStream等。
装饰器为输入/输出的数据做处理,例如缓冲、串行化、数据装换等。
printWriter与PrintStream处理可以对OutputStream打包之外,Printwriter还可以对writer进行打包,提供print()、println()、format()等方法。
import java.io.IOException;
import static java.lang.System.out;
public class MemberDemo {
public static void main(String[] args) throws IOException {
Member[] members = {
new Member("B1234", "Justin", 90),
new Member("B5678", "Monica", 95),
new Member("B9876", "Irene", 88)
};
for(Member member : members) {
member.save();
}
out.println(Member.load("B1234"));
out.println(Member.load("B5678"));
out.println(Member.load("B9876"));
}
}
Reader、Writer也有一些装饰器类可供使用,如果串流处理的字节数据,实际上代表某些字符的编码数据,而你想要将这些字节数据转换为对应的编码字符,可以使用InputStreamReader和OutputStreamWriter
解析几个常用子类: StringReader可以将字符串打包,当做读取来源,StringWriter可以作为写入目的地,最后toString()取出所有写入的字符组成的字符串。CharArrayReader、CharArrayWriter类似,将char数组当做读取来源以及写入目的地。
如果处理串流字节数据,将这些字节数据转换为对应的编码制度,可以使用 InputStringReader、InputStringWriter打包。
第十一章
如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run()方法中。
如果想要加装主线程,就要创建 Thread 实例,要启动额外的主线程就是调用 Thread 实例的 start() 方法。
主线程会从main()方法开始执行,直到main()方法结束后停滞JVM。如果主线程中启动了额外线程,默认会等待被启动的所有线程都执行完run()方法才终止JVM。如果一个Thead被表示为Daemon线程,在所有的非Daemon线程都结束时,JVM自动就会终止。
Thread基本状态图:优先权高的先执行,否则输流执行。start——>runnable——>(blocked)——>running——>dead
安插线程:当线程使用join()加入至另一个线程时,另一个线程会等待被加入的线程工作完毕,然后在继续它的动作,join()的意思表示将线程加入称为另一个线程的流程中。
停止线程:线程完成run()方法后,就会进入Dead,进入Dead的线程不可以再次调用start()方法,否则会抛出IllegalThreadStateException异常。
import java.util.Arrays;
public class ArrayList {
private Object[] list;
private int next;
public ArrayList(int capacity) {
list = new Object[capacity];
}
public ArrayList() {
this(16);
}
public void add(Object o) {
if(next == list.length) {
list = Arrays.copyOf(list, list.length * 2);
}
list[next++] = o;
}
public Object get(int index) {
return list[index];
}
public int size() {
return next;
}
}
- CopyOnWriteArraySet操作了List接口,这个类的实例在写入操作时,内部会建立新数组,并复制原有数组索引的参考,然后在新数组上进行写入操作,写入完成后,再将内部原参考旧数组的变量参考至新数组.
教材学习中的问题和解决过程
- 一、标准输入输出:
- 解决方案:
1.System.in: 标准输入,默认关联到键盘(终端输入)
2.System.out: 标准输出,默认关联到显示器(终端输出)
3.System.err: 标准错误,默认关联到显示器(终端输出)
4.输入输出重定向:setIn,setOut,setErr - 二、线程控制的一些方法:
- 解决方案:
1.interrupt
2.sleep
3.join
4.stop(Deprecated)
5.resume(Deprecated)
6.suspend(Deprecated)
7.destroy(Deprecated)
8.线程的停止、暂停、重启要程序员设定实现条件或使用并发API,不要调用Deprecated的方法
9.同步:synchronized与volatile 2)方法上;2)代码段上;
10.wait、notify、notifyAll
代码调试中的问题和解决过程
- 一、课本P326的Tortoise程序中直接使用Runnable接口会报错
public class Tortoise implements Runnable {
private int totalStep;
private int step;
public Tortoise(int totalStep) {
this.totalStep=totalStep;
}
- 二、在学习p343时,不正确的使用
synchronized
会出现“死结” - 为了避免Lock对象的lock方法后,在后续执行流程中抛出异常而无法解除锁定,一定要在finally中调用Lock对象的unlock方法。
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 现有:1. import java.util.*;
2.- Class FindStuff {
4.public static void main (String[]args) { - //insert code here
6. c.put ("X", 123);
7. } - }
分别插入到第5行,哪几行允许代码编译?(BDF)
A .
Map c= new SortedMap();
B .
HashMap c= new HashMap();
C .
HashMap c= new Hashtable();
D .
SortedMap c= new TreeMap();
E .
ArrayList c= new ArrayList();
F .
Map c = new LinkedHashMap();
- Class FindStuff {
- 现有:
- list是一个合法的集合引用
- getCollection()返回一个合法集合的引用
哪个是合法的?(BE)
A .
or(Object o ; list)
B .
for(Object o : getCollection())
C .
for(Object o : list.iterator())
D .
for(lterator i ; list.iterator() ; i.hasNext () )
E .
for(lterator i=list.iterator(); i.hasNext (); )
结对及互评
评分标准
- 正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
- 模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
教材学习中的问题和解决过程, 一个问题加1分
代码调试中的问题和解决过程, 一个问题加1分
- 本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
- 其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
- 扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
点评过的同学博客和代码
其他(感悟、思考等,可选)
本周内容较多,通过练习实际操作中的代码编写过程,发现很多东西在书上学不到,以后更应该增强实际应用。我认为老师说的方法有道理,可以先快速的把书看一遍,再通过视频的学习逐步加深,真正编写代码的时候有不会的地方回头查书。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 20篇 | 200小时 | |
第一周 | 8/10 | 1/4 | 8/10 | 编写第一个Java程序HelloWorld |
第二周 | 79/89 | 1/5 | 11/21 | 学习Java基础语法 |
第三周 | 249/338 | 1/6 | 16/37 | 学习Java关于对象的重要知识 |
第四周 | 331/669 | 1/7 | 17/54 | 学习Java关于继承、接口与多态的重要知识 |
第五周 | 507/1176 | 1/8 | 18/72 | 学习Java的异常处理、Collection与Map |
第六周 | 1321/2497 | 1/9 | 16/88 | 学习Java的输入、输出与线性、并行API |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:20小时
实际学习时间:16小时
改进情况:学习时间跟上周差不多,但这周其他课的实验特多,所以还是有所进步的。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)