20155334 2016-2017-2 《Java程序设计》第六周学习总结
2017-04-02 22:11
337 查看
20155334 2016-2017-2 《Java程序设计》第六周学习总结
教材学习内容总结
第十章:输入/输出
InputStream与OutputStream
java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象。从应用程序角度来看,如果要将数据从来源取出,可以使用输入串流,如果要将数据写入目的地,可以使用输出串流。
在JAVA中,输入串流代表对象为
java.io.InputStream实例,输出串流代表对象为
java.io.OutputStream实例。
通用的
dump()方法
import java.io.*; public class IO { public static void dump(InputStream src, OutputStream dest) throws IOException { try (InputStream input = src; OutputStream output = dest) { byte[] data = new byte[1024]; int length; while ((length = input.read(data)) != -1) { output.write(data, 0, length); } } } }
10.1.2串流继承架构
System.in:文本模式下取得整行用户输入。可以使用
System的
setIn()方法指定
InputStream实例,重新指定标准输入来源。
System.out为
PrintStream实例。使用
setOut()方法指定
PrintStream实例,将结果输出至指定的目的地
System.err为
PrintStream实例,称为标准错误输出串流,用来立即显示错误信息。
使用
System.setErr()指定
PrintStream重新指定标准错误输出串流。
FileInputStream是
InputStream的子类,可以指定文件名创建实例,一旦创建文档就开启,接着就可用来读取数据,主要操作
InputStream、
read()抽象方法,使之可以从文档中读取数据。
FileOutputStream可以指定文件名创建实例,一旦创建文档就开启,接着就可用来写出数据,主要操作
InputStream的
write()抽象方法,使之可以写出数据至文档。
ByteArrayInputStream是
InputStream的子类,可以指定byte数组创建实例,一旦创建就可将 byte 数组当作数据源进行读取。主要操作了
InputStream的
read()抽象方法,使之可从byte数组中读取数据。
ByteArrayOutputStream是
OutputStream的子类可以指定byte数组创建实例,一旦创建就可将byte数组当作目的地写出数据。主要操作了
OutputStream的
write()抽象方法,使之可写出数据至byte数组。
10.1.3串流处理装饰器
BufferedInputStream与
BufferedOutputStream主要在内部提供缓冲区功能。
BufferedInputStream与
BufferedOutputStream主要在内部提供缓冲区功能。
DataInputStream与
DataOutputStrea用来装饰
InputStream、
OutputStream、
DataInputStream、
DataOutputStream提供读取、写入java基本数据类型的方法,像是s读写
int
double
boolean等的方法。这些方法会自动在指定的类型与字节间转换。
10.2 字符处理类
10.2.1 Reader与Writer 继承架构
针对字符数据的读取,Java SE 提供了
java.io.Reader类,其抽象化了字符数据读入的来源。针对字符数据的写入,Java SE 提供了
java.io.Writer类,其抽象化了数据写出的目的地。
如果从来源读入字符数据、将字符数据写至目的地,可以使用
CharUtil.dump()方法
每次从
Reader读入的数据,都会先置入 char 数组中
Reader的
read()方法,每次会尝试读入
char数组长度的数据,并返回实际读入的字符数,只要不是-1,就表示读取到字符。可以使用
write()方法,指定要写出的 byte 数组、初始索引与数据长度。
使用
CharUtil.dump()读入文档、转为字符串并显示在文本模式中:
10.2.2 字符处理装饰器
可以使用
InputStreamReader与
OutputStreamWriter对串流数据打包。
BufferedReader与
BufferedWriter,可对
Reader、
Writer提供缓冲区作用,在处理字符输入/输出时,对效率也会有所帮助。
PrintWriter:除了可对OutStream打包之外,还可对Writer 进行打包,提供
print()、
println()、
format()方法。
要先掌握父类中方法,核心类如下:
第十一章:线程与并行API
11.1线程简介
Thread基本状态图
从抽象观点来看,JVM是台虚拟计算机,只安装一颗称为主线程的CPU,可执行
main()定义的执行流程。如果想要为JVM加装CPU,就是创建Thread实例,要启动额外CPU就是调用Thread实例的
start()方法,额外CPU执行流程的进入点,可以定义在Runnale接口的
run()方法中。
Daemon线程
Daemon线程:主线程会从
main()方法开始执行方法结束后停止JVM。如果主线程中启动了额外线程,默认会等待被启动的所有线程都执行完
run()方法才中止JVM。
在所有的非
Daemon线程都结束时,JVM自动就会中止。可以使用
setDeamon()方法来设定一个线程是否为
Daemon线程,可以使用
isDaemon()方法来判断线程是否为
Daemon线程。
Daemon线程,在所有的非
Daemon线程都结束时,JVM就会终止。
synchronized与
volatile
synchronized:
每个对象都会有个内部锁定,或称为监控锁定。被标示为
synchronized的区块将会被监控,任何线程要执行
synchronized区块都必须先取得指定的对象锁定。如果在方法上标示
synchronized,则执行方法必须取得该实例的锁定。
线程若因尝试执行
synchronized区块而进入
Blocked,在取得锁定之后,会先回到Runnable状态,等待CPU排版器排入Running状态。
java的
synchronized提供的是可重入同步,也就是线程取得某对象锁定后,若执行过程中又要执行
synchronized,尝试取得锁定的对象来源又是同一个,则可以直接执行由于线程无法取得锁定时会造成阻断,不正确地使用
synchronized有可能造成能效低落,另一问题则是死结,例如有些资源在多线程下彼此交叉取用,有可能造成死结。
使用
volatile:
synchronized要求达到的所标示区块的互斥性与可见性,互斥性是指
synchronized区块同时间只能有一个线程,可见性是指线程离开
synchronized区块后,另一线程接触到的就是上一线程改变后的对象状态。
在java中对于可见性的要求,可以使用
volatile达到变量范围。
可以在变量上声明
volatile,表示变量是不稳定的、易变的,也就是可能在多线程下存取,这保证变量的可见性,也就是若有线程变动了变量值,另一线程一定可以看到变更。被标示为
volatile的变量,不允许线程快取,变量值的存取一定是在共享内存中进行。
11.2 并行API
wait()、
notify()、
notifyAll()是object定义的方法,可以通过这3个方法控制线程释放对象的锁定,或者通知线程参与锁定竞争。
若调用锁定对象的
wait()方法,线程会释放对象锁定,并进入对象等待集合从而处于阻断状态,其他线程可以竞争对象锁定,取得锁定的线程可以执行synchronized范围的程序代码。
放在等待集合的线程不会参与CPU排班,
wait()可以指定等待时间,时间到之后线程会再次加入排班。
如果指定时间0或不指定,则线程会持续等待,直到被中断(调用
interrupt())或是告知(
notify())可以参与排班。
LOCK:锁定lock对象,可以调用其lock方法,只有取得lock对象锁定的线程,才可以继续往后执行程序代码。解除锁定要调用
unlock()。
Executor:将
Runnable的指定与实际如何执行分离。
11.2.2使用Executor
从JDK5 开始,定义了
java.util.concurrent.Executor接口,目的是将
Runnable的指定与实际如何执行分离。
Executor接口只定义了一个
execute()方法:
`
package java.util.concurrent; public interface Executor{ void execute(Runnable command); }
1.使用
ThreadPoolExecutor
根据不同的线程池需求,
ThreadPoolExecutor拥有数种不同构造函数可供使用,不过通常会使用
java.util.concurrent.Executors的
newCachedThreadPool()、
newFixedThreadPool()静态方法来创建
ThreadPoolExecutor实例。
2.使用
ScheduledThreadPoolExecutor
ScheduledExecutorService的操作类
ScheduledThreadPoolExecutor为
ThreadPoolExecutor的子类,具有线程池与排程功能。
3.使用
ForkJoinPool
java.util.ForkJoinPool主要目的是在解决分而治之的问题
在分而治之需要结合并行的情况下,可以使用
ForkJoinTask,其操作了
Future接口,可以让你在未来取得耗时工作的执行结果
ForkJoinPool与其他的
ExecutorService操作不同的地方在于,它实现了工作窃取演算,其建立的线程如果完成手边任务,会尝试寻找并执行其他任务建立的子任务,让线程保持忙碌状态,有效利用处理器的能力。
教材学习中的问题和解决过程
问题1:不明白字符处理类问题1解决方案:针对字符数据的读取,Java SE 提供了
java.io.Reader类,其抽象化了字符数据读入的来源。
问题2:不是太了解
volatile
问题2解决方案:表示变量是不稳定的、易变的,也就是可能在多线程下存取,这保证变量的可见性,也就是若有线程变动了变量值,另一线程一定可以看到变更。
代码调试中的问题和解决过程
问题1:在编译JoinDemo.java中发现编译不通过问题问题1解决方案:经检查发现是由于粗心导致字符出错,修改后编译通过。由此可见,认真的必要性。
代码托管
上周考试错题总结
由于上周在蓝墨云班课APP上答题,老师也没有在2016-2017-2 《Java程序设计》试题解析中张贴出来,只好在同学们的博客找了些我自己也出错的问题总结下9.实现了set接口类是哪一项(B)
A. ArrayList
B. Hashset
C. HashTable
D. Collection
12.集合API 中Set接口的特点是?(D)
A .不允许重复元素,元素有顺序
B .允许重复元素,元素无顺序
C .允许重复元素,元素有顺序
D .不允许重复元素,元素无顺序
5.现有:
import java.util.*; class ForInTest { static List list=new ArrayList(); } public static void main (String [] args) { list. add("a"); list. add("b");list. add( "c"); //insert code here System.out.print (o); } }
哪一行插入到第9行将导致输出“abc"?(D)
A .for (Iterator o : list.iterator(); o.hasNext (); )
B .for (Iterator o : list)
C .for (Object o : list.iterator())
D . for (Object o : list)
结对及互评
评分标准
正确使用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
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
点评过的同学博客和代码
本周结对学习情况20155319
结对学习内容:相互查看对方代码,并对学习中遇到的疑问进行交流,合作解决编程过程中遇到的问题。
上周博客互评情况
20155205
20145207
20155313
20155324
其他(感悟、思考等,可选)
面对Java无从着手的感觉越来越重,特别是每周两章节的内容让人不堪重负,一方面要看完书中内容,另一方面要撰写博客,不知道是要边看边写,还是看完后总结的去写,导致每周都是在堆砌书上的内容,想要写出出色的博客就得不断地思考,查询相应的内容,和同学结伴而行,共同进步。学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 5/5 | 1/1 | 10/10 | |
第二周 | 90/95 | 1/2 | 15/25 | |
第三周 | 131/234 | 1/3 | 20/45 | |
第四周 | 289/523 | 1/4 | 21/66 | |
第五周 | 446/969 | 1/5 | 25/91 | |
第六周 | 720/1689 | 1/6 | 25/116 |
计划学习时间:30小时
实际学习时间:25小时
改进情况:增加了代码提交的次数和代码的数量,延长了学习时间。
参考资料
Java学习笔记(第8版)《Java学习笔记(第8版)》学习指导
相关文章推荐
- 20155227 2016-2017-2 《Java程序设计》第六周学习总结
- 20155229 2016-2017-2 《Java程序设计》第六周学习总结
- # 20155337 2016-2017-2 《Java程序设计》第六周学习总结
- 20155310 2016-2017-2 《Java程序设计》第六周学习总结
- 20155334 2016-2017-2 《Java程序设计》第一周学习总结
- 20155220 2016-2017-2 《Java程序设计》第六周学习总结
- 20155318 2016-2017-2 《Java程序设计》第六周学习总结
- 20155216 2016-2017-2 《Java程序设计》第六周学习总结
- 20155313 2016-2017-2 《Java程序设计》第六周学习总结
- 20155319 2016-2017-2 《Java程序设计》第六周学习总结
- 20155238 2016-2017-2 《Java程序设计》第六周学习总结
- 20155334 2016-2017-2 《Java程序设计》第四周学习总结
- 20155305乔磊2016-2017-2《Java程序设计》第六周学习总结
- 20155334 2016-2017-2 《Java程序设计》第三周学习总结
- 20155302 2016-2017-2 《Java程序设计》第六周学习总结
- 20155328 2016-2017-2 《Java程序设计》第六周 学习总结
- 20155320 2016-2017-2 《Java程序设计》第六周学习总结
- 20155330 2016-2017-2 《Java程序设计》第六周学习总结
- 20155225 2016-2017-2 《Java程序设计》第六周学习总结
- 20155321 2016-2017-2 《Java程序设计》第六周学习总结