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

20155207 2016-2017-2 《Java程序设计》第八周学习总结

2017-04-16 19:54 351 查看

20155207 2016-2017-2 《Java程序设计》第八周学习总结

教材学习内容总结

第15章 通用API

15.1 日志

15.1.1 日志API简介

java.util.loggging
包提供了日志功能相关类与接口

使用日志的起点是
Logger
类,Logger类的构造函数表示为protected,不是
java.util.logging
同包的类不能直接以new创建,取得Logger实例,必须用Logger的静态方法
getLogger()


调用
getLogger()
时必须指定Logger实例所属空间名称,以 . 区分层级,名称空间层级相同的Logger,其父Logger组态相同

类之后接
.class
,可取得该类的
java.lang.class
实例,调用其
getName()
就可以取得类全名

取得Logger实例之后,可以使用Log()方法输出信息,输出信息时可以使用Level的静态成员指定信息层级

要输出的信息,必须先通过Logger的Level与Filter过滤,再通过Handler的Level和Filter过滤,格式化信息的动作交给Formatter

15.1.2 制定日记层级

Level如果没做任何修改,取得的Logger实例之父Logger组态,Level默认是
Logger.GLOBAL_LOGGER_NAME
(INFO)名称空间Logger实例的组态,Handler默认是
ConsoleHandler


Logger实例的
getParent()
取得父Logger实例,
getlevel()
取得设定的Level实例

Logger实例的层级必须大于或等于父Logger的Level

可通过Logger的
setLevel()
设定层级,可用Level内建几个静态成员来指定

使用
intVlue()
取得内含int值

log()
时指定的Level实例内含的int值小于Logger设定的Level实例内含的int值,Logger就不会记录信息

Level.OFF
用于关闭所有信息输出,
Level.ALL
用于允许所有信息输出

一个Logger可以有多个Handler,通过
addHandler()
removeHandler()
新增、移除Handler实例

getHandlers()
方法来取得目前已有的Handler实例数组

Handler可以通过
setLevel()
设定信息

一些日志层级,Logger有其对应的简便方法

15.1.3 使用Handler与Formatter

MemoryHandler
(信息存在缓冲区,超出缓冲区大小)、
StreamHandler
(可自动指定OutputStream实例)、
ConsoleHandler
(日志信息会显示在控制台上)、
FileHandler
(建立日志输出时使用的FileOutputStream)、
SocketHandler
(联网,将日志信息传至指定主机)

addHandler()
removeHandler()
新增、移除Handler

建立FileHandler指定模式字符串,“%h”表示用户根目录,“%t”取得系统暂存目录,“%g”自动为文档编号

Logger的
Config()
是个简便方法,可以直接Level.CONFIG层级输出信息,也有
severe()
info()
等简便方法

调用Logger实例的
setUseParentHandlers()
设定为false,日志不会传播给父Logger,使用
setParent()
方法指定父Logger

15.1.4 自定义Handler、Formatter与Filter

java.util.logging包中提供的Handler成果都不符合需求,继承Handler类,操作抽象方法
publish()
flush()
close()
方法来定义Handler,操作时考虑信息过滤与格式化

自定义Formatter,继承Formatter后操作抽象方法
format()
,传入LogRecord,储存所有日志信息

15.1.5 使用logging.properties

通过logging.properties来设定Logger组态,修改.properties后另存至程序CLASSPATH中,指定java.util.logging.cofig.file系统属性为.properties名称

15.2 国际化基础

15.2.1 使用ResourceBundle

使用ResourceBundle做信息绑定,准备.properties文档并放在CLASSPATH的路径设定下,文件中撰写键/值配对

ResourceBundle的静态
getBundle()
方法会取得一个ResourceBundle实例,给定自变量名称是信息文档的主文件名,取得实例后用
getString()
指定键取得文档中对应值

15.1.2 使用Locale

国际化三个重要概念:地区(Locale)信息、资源包(Resource bundle)与基础名称(Base name)

地区可由一个语言编码与可选的地区编码来指定

地区信息对应类是Locale,建立Locale实例时,可指定语言编码与地区编码

资源包中包括了特定地区的相关信息

将Unicode编码表示的.properties转回中文,使用-reverse自变量

15.3 规则表达式

15.3.1 规则表达式简介

String的
spilt()
方法,返回切割后各子字符串组成的String数组

规则表达式基本包括两种字符:字面意义字符与元字符

1.字面意义字符

字母或数字:比较字母或数字

\:比较\

2.字符类

任一个字符切割:[]

连字符—:表示从...到...

反字符^:表示除...以外的字符

预定义字符

3.贪婪、逐步、独吐量词

贪婪量词:是贪婪量词表示法的一种,贪婪量词会尽可能的找到长度最长的符合文字

逐步量词:在贪婪量词表示法后加上?,会成为逐步量词(懒惰量词,非贪婪量词),会找到长度最短的符合文字

独吐量词:在贪婪量词表示法后加上+,会成为独吐量词,将剩余文字吃掉,然后看看独吞量词部分是否符合吃下的文字,如果符合就不会再吐出来了

replaceAll()
会将符合规则表达式的字符串取代后返回新字符串

4.边界比较

边界比较用来表示文字必须符合指定的边界条件(定位点)

5.分组与参考

使用()将规则表达式分组,被分组的规则表达式可以在稍后回头参考

15.3.2 Pattern与Matcher

java.util.Regex.Pattern实例是规则表达式在JVM中的代表对象,Pattern的构造函数被标示为private,无法用new创建Pattern实例,必须通过Pattern的静态方法
compile()
来取得

取得Pattern实例后,可以使用
mather()
方法将指定字符串依规则表达式切割

使用
matcher()
方法指定要比较的字符串,
find()
方法看是不是有下一个符合字符串,
lookingAt()
看字符串开头是否符合规则表达式,
group()
方法返回符合的字符串

规则表达式中有分组,group()可以接受int整数指定分数计数(1-...),group(0)相当于group()

replaceAll()
方法,将符合规则表达式的部分以指定的字符串替代,
replaceFirst()
replaceEnd()
分别可取代首个、最后反符合规则表达式部分,
start()
方法可取得符合字符串的起始索引,
end()
取得符合字符串最后一个字符后的索引

15.4 JDK8 API增强功能

15.4.1 StringJoiner、Arrays新增API

1.String.join()、StringJoiner

String上有
join()
静态方法可以指定每个字符串间以什么间隔

Collectors上有
joining()
静态方法

2.Arrays

paralleSort()
方法可以将指定的数组分为子数组并以平行化方式分别排序,然后再进行合并排序

15.4.2 Stream相关API

对数组进行管线化操作

使用
Arrays
asList()
方法返回List,而后调用
stream()
方法取得stream实例

使用
Arrays
stream()
方法,可以指定数组后返回Stream实例

教材学习中的问题和解决过程

问题:p471LoggerDemo为什么不会输出Level.CONFIG和Level.FINE的信息

解决过程:结合P472图示与P473讲解,得知Logger的层级必须大于等于父Logger,才能将信息输出至控制台,Logger层级默认为INFO,Level.CONFIG和Level.FINE都小于INFO,所以不会输出

代码调试中的问题和解决过程

本周代码调试没有问题

代码托管



上周考试错题总结

错题1:vi中哪条命令是不保存强制退出?
A .:wq

B .:wq!

C .:q!

D .:q

理解情况 C.:wq 是保存退出。 !表示强制。

错题2:hen applied to instance variables, the ________________ visibility modifier enforces encapsulation(当应用到实例变量时,____可见性修饰符强制执行封装).
A .static

B .final

C .public

D .private

E .none of the above(以上都不是)

错题3:Given the following, which answers can correctly fill in the blank? (Choose all that apply.)针对下面的代码,()中应填入哪个选项?
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, zoneId);
long epochSeconds = 0;
Instant instant = ( );
A .Instant.now()

B .Instant.ofEpochSecond(epochSeconds)

C .date.toInstant()

D .dateTime.toInstant()

E .time.toInstant()

F .zonedDateTime.toInstant()

结对及互评

评分标准

正确使用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

...

点评过的同学博客和代码

本周结对学习情况 :通用API

20155223

结对照片



结对学习内容
-通用API

上周博客互评情况

20155306

20155321

20155307

20155311

其他(感悟、思考等,可选)

学习了将系统运行记录到日志的方法,通过日志的层级关系,结合了继承的知识,更深的理解了父类和子类的关系,还学习了国际化标准和规则表达式

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周0/02/220/20
第二周186/1862/418/38
第三周689/8753/722/60
第四周242/11172/930/90
第五周698/18152/930/120
第六周1269/30842/930/120
第七周342/34262/930/120
第八周398/38242/930/120
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

计划学习时间:24小时

实际学习时间:23小时

改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表)

参考资料

Java学习笔记(第8版)

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