20155315 2016-2017-2 《Java程序设计》第六周学习总结
教材学习内容总结
第10章 输入与输出
1.串流设计的概念
从应用程序角度看,将数据从来源取出,可以使用输入串流,将数据写入目的地,可以使用输出串流;在Java中,输入串流代表对象为java.io.InputStream实例,输出串流代表对象为java.io.OutputStream实例;
System.in
标准输入System.out
标准输出- System的
setIn()
方法指定InputStream实例 - System的
setOut()
方法指定printStream实例 System.err
为printStream实例,称为标准输出串流,用于立即显示错误信息
2.FileInputStream和FileOutputStream
- FileInputStream可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来写出数据,主要操作了InputStream的read()抽象方法,从而读取文档中的数据;
- FileOutputStream可以指定文件名创建实例,一旦创建文档就开启,接着就可以用来写出数据,主要操作了OutputStream中的write抽象方法,使之可写出数据到文档。
3.ByteStream
ByteStream是InputStream的子类,可以指定byte数组创建实例,一旦创建就可以将byte数组当做数据源进行读取。ByteArrayOutputStream是OutputStream的子类,可以指定byte数组创建实例,一旦创建就可以将byte数组当做目的地写出数据;
4.串流装饰处理器
- 若想要为输入输出的数据作加工处理,可以使用打包器类(如:scanner);
- InputStream和OutputStream的一些子类也具有打包器的作用,这些子类创建时,可以接受InputStream和OutputStream实例;
- 常用打包器:BufferedInputStream、BufferOutputSream(具备缓冲区作用),DataInputStream、DataOutputStream(具备数据转换处理作用),ObjectInputStream、ObjectOutputStream(具备对象串行化能力)等;
5.Reader与Writer继承架构
java.io.Reader
类:抽象化了字符数据读入的来源;java.io.Writer
类:抽象化了数据写出目的地;- FileReader:读取文档并将读到的数据转换成字符;
- StringWriter:将字符数据写至它最后使用toString()的方法取得字符串;
第11章:线程与并行API
1.线程
- 单线程程序:启动的程序从
main()
程序进入点开始至结束只有一个流程; - 多线程程序:拥有多个流程;
- java中从
main()
开始的流程会由主线程执行可以创建Thread实例来执行Runable实例定义的run()方法
2.Thread和Runnable
- 创建Thread实例就是为JVM加装CPU,启动额外CPU就是调用实例的
start()
方法,额外CPU的进入点可以定义在Runable接口的run()
方法中; - 另一个撰写多线程程序的方式就就是继承Thread类,重新定义
run()
方法;
3.线程生命周期
如果一个Thread被标示为Deamon线程,在所有的非Deamon线程都结束时,JVM就会自动终止
4.ThreadGroup
- 每个线程都属于某个线程群组,线程一旦归入某个群组,就无法再更换;可以使用以下程序片段取得当前线程所属线程群组名:
Thread.currentThread().getThreadGroup().getname()
; - 使用uncoughtException()方法处理群组中某个线程出现异常未被捕捉的情况,可以重新定义此方法
5.并行API
使用Thread建立多线程程序,必须亲自处理synchornized、对象锁定、wait()、notify()、notifyAll()等细节,如果需要的是线程池、读写解锁高等级操作,从JDK5之后提供了java.util.concurrent
,可基于其中的API建立更稳固的并行应用程序。
6.Lock和ReadWriteLock
- lock接口主要操作类之一为
ReentrantLock
,可以达到synchronized的作用。 ReadWriteLock
接口定义了读取锁定与写入锁定行为,可以使用readLock()
、writeLock()
方法返回Lock操作对象。StampedLock
类可支持了乐观读取操作。也就是若读取线程很多,写入线程很少的情况下,你可以乐观地认为,写入与读取同时发生的机会很少,因此不悲观的使用哇暖的读取锁定,程序可以查看数据读取之后,是否遭到写入线程的变更,再采取后续的措施。
教材学习中的问题和解决过程
- 问题1: 如果一个对象所持有的数据可以被多线程同时共享存取时,有什么要考虑的吗
- 解决1: 必须考虑到数据同步的问题
·数据同步指的是两份数据整体性、一致性 - 问题2: 串流处理数据字节要注意什么,要怎么做?
- 解决2: 如果串流处理的字节数据,实际上代表某些字符的编码数据,如果想要将这些字节数据转换为对应的编码字符,可以使用InputStreamReader、OutputStreamWriter对串流数据打包。BufferedReader、BufferedWriter可对Reader、Writer提供缓冲区作用,在处理字符输入/输出时,对效率也会有所帮助。PrintReader、PrintStream使用上极为类似,不过除了可以对OutputStream打包之外,PrintWriter还可以对Writer进行打包,提供print()、println()、format()等方法。
代码调试中的问题和解决过程
- 运行上周的考试代码发现
点开编译界面,发现&也分中英文输入的区别,改完之后,运行结果为
代码托管
-
用statistics脚本查看代码行数
-
代码提交结果
上周考试错题总结
-
4.现有:
- list是一个合法的集合引用
- getCollection()返回一个合法集合的引用
哪个是合法的?
B .for(Object o : getCollection());
E .for(lterator i=list.iterator(); i.hasNext (); )
理解情况:B选项是增强式的for循环;E选项是for循环的常规用法。
-
5.现有:
3. import java.util.*; 4. class ForInTest { 5.static List list=new ArrayList(); 6. 7.public static void main (String [] args) { 8.list. add("a"); list. add("b");list. add( "c"); 9. //insert code here 10. System.out.print (o); 11. } 12. }
哪一行插入到第9行将导致输出“abc"?
D .for (Object o : list)
理解情况:D选项是增强式的for循环;其它选项中代码的选项都不规范 -
6.Which of the following methods will not compile?
A .
private void method1(String name) {
if (name.equals("star"))
throw new IllegalArgumentException(name);
}B .
private void method2(int age) {
if (age > 30)
throw Exception();
}C .
public double method5() throws Exception {
return 0.7;
}D .
protected double method4() throws Exception {
throw new Throwable();
}
理解情况:
B .
private void method2(int age) {
if (age > 30)
throw Exception();
}
D .protected double method4() throws Exception {
throw new Throwable();
}
这两个代码编译不通过。
- 29.现有:
1. class Test4 {
2. public static void main (String [] args) {
3. boolean x=true;
4. boolean y=false;
5. short z=42;
7. if((z++==42) && (y=true))z++;
8. if((x=false) || (++z==45)) z++;
9. System. out.println(¨z=”+z);
10. }
11. }
理解情况:
结对及互评
评分标准(满分10分)
-
从0分加到10分为止
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
6 其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
7 扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
点评模板:
-
博客中值得学习的或问题:
- xxx
- xxx
- ...
-
代码中值得学习的或问题:
- xxx
- xxx
- ...
-
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
点评过的同学博客和代码
收获
这一周知识点越来越难,也越来越需要前期准备的配合。经常看到一半不理解又翻到前面重新学习,代码也是经常出现一些拼写错误和其他编译异常。总的来说,这一周的学习较为浮躁,很多代码和知识都是一知半解,这样很不利于深入学习Java。下周任务更重,希望自己能尽快调整好状态和时间,迎接新的知识和挑战。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 20/20 | 1/1 | 10/10 | 安装了JDK、IDEA和Git,写了第一个Java程序 |
第二周 | 97/117 | 2/3 | 20/30 | 用Linux上传代码,熟悉修改文件的命令行 |
第三周 | 336/453 | 2/4 | 35/65 | 在Linux上安装JDK和IDEA,更熟悉vi的操作指令以及修改时需要注意的地方。 |
第四周 | 851/1304 | 1/5 | 25/90 | 学习用JDB调试程序 |
第五周 | 834/2138 | 1/7 | 32/122 | 能自己设计简单的程序,遇到问题也基本上能通过前面的学习和查资料解决,还有问题没有得到解决。 |
第六周 | 573/2711 | 1/8 | 15/137 | 理解课本中的内容并自己把之前的代码加以改正,更理解程序的作用,继续学习用JDB调试程序 |
- 计划学习时间:25小时
- 实际学习时间:15小时