您的位置:首页 > 编程语言 > Java开发

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/51/110/10
第二周90/951/215/25
第三周131/2341/320/45
第四周289/5231/421/66
第五周446/9691/525/91
第六周720/16891/625/116
参考:软件工程软件的估计为什么这么难软件工程 估计方法

计划学习时间:30小时

实际学习时间:25小时

改进情况:增加了代码提交的次数和代码的数量,延长了学习时间。

参考资料

Java学习笔记(第8版)

《Java学习笔记(第8版)》学习指导
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: