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

20145205 《Java程序设计》第8周学习总结

2016-04-24 22:13 330 查看

教材学习内容总结

第十五章 通用API

15.1 日志

日志API简介

java.util.logging
包提供了日志功能相关类与接口,不必额外配置日志组件,就可在标准Java平台使用是其好处。使用日志的起点是
Logger
类,
Logger
类的构造函数标示为
protected
,不是
java.util.logging
同包的类不能直接以
new
创建,要取得
Logger
实例,必修使用
Logger
的静态方法
getLogger()


调用
getLogger()
时,必须指定
Logger
实例所属名称空间,名称空间以“.”作为层级区分,名称空间层级相同的
Logger
,其父
Logger
组态相同。通常在哪个类中取得的
Logger
,名称空间就会命名为哪个类全名。

简单来说,
Logger
是记录信息的起点,要输出的信息,必须先通过
Logger
Lever
Filter
过滤,在通过
Handler
Lever
Filter
过滤,格式化信息的动作交给
Formatter
,输出信息的动作实际上是
Handler
负责。

Logger
有层级关系,名称空间层级相同的
Logger
,父
Logger
组态会相同,每个
Logger
处理完自己的日志动作后,会向父
Logger
传播,让父
Logger
也可以处理日志。

指定日志层级

取得的
Logger
实例之父
Logger
组态,就是
Logger.GLOBAL_LOGGER_NAME
名称空间
Logger
实例,可通过
getParent()
取得设定的
Logger
实例,可通过
getLevel()
取得设定的
Level
实例。

Logger
的信息处理会往父
Logger
传播,在没有做任何组态设定的情况下,默认取得的
Logger
实例,层级必须大于或等于
Logger.GLOBAL_LOGGER_NAME
名称空间
Logger
实例设定的
Lever.INFO
,才有可能输出信息。

可以通过
setLevel()
设定
Level
实例,若
log()
时指定的
Lever
实例内含的
int
值小于
Logger
设定的
Level
实例内含的
int
值,
Level
就不会记录信息。

在经过
Logger
过滤之后,还得再经过
Handler
的过滤,一个
Logger
可以拥有多个
Handler
,可通过
Logger的addHandler()
新增
Handler
实例。实际上进行信息输出时,目前
Logger
Handler
处理完,还会传播给父
Logger
的所有
Handler
处理,可通过
getHandlers()
方法取得目前已有的
Handler
实例数组。

在没有做任何组态设定的情况下,取得的
Logger
实例,只会使用
Logger.GLOBAL_LOGGER_NAME
名称空间
Logger
实例拥有的
Handler
,默认是使用
ConsoleHandler
,为
Handler
的子类,作用是在控制台下输出日志信息,,默认地层级是
Level.INFO


使用Handler与Formatter

负责日志输出的是
Handler
实例。标准
API
中提供几个
Handler
操作类:

MemoryHandler
不会格式化日志信息,信息会暂存于内存缓冲区,直到超过缓冲区大小,才将信息输出至指定的目标
Handler


StreamHandler
可自行指定信息输出时使用的
OutputStream
实例,它与子类都会使用指定
Formatter
格式化信息。

ConsoleHandler
创建时,会自动指定
OutputStream
System.err
,所以日志信息会显示在控制台。

FileHandler
创建时会建立日志输出时使用的
FileOutputStream
,文档位置与名称可以使用模式
Pattern
字符串指定。

SocketHandler
创建时可以指定主机位置与端口,内部将自动建立网络联机,将日志信息传送至指定的主机。

Logger
可以使用
addHandler()
新增
Handler
实例,使用
removeHandler()
移除
Handler


FileHandler
默认的
Formatter
XMLFormatter


ConsoleHandler
默认使用
SimpleFormatter
;这两个类是
Formatter
的子类,可以通过
Handler
setFormatter()
方法设定
Formatter


自定义Handler、Formatter与Filter

如果
java.util.logging
包中提供的
Handler
成果都不符合需求,可以继承
Handler
类,操作抽象方法
publish()
flush()
close()
方法来自定义
Handler


在职责分配上,
Handler
是负责输出,格式化是交由
Formatter
,而信息过滤是交由
Filter。Handler
有默认的
isLoggable()
操作,会先依据
Level
过滤信息,再使用指定的
Filter
过滤信息。
format()
方法会传入
LogRecord
,存储所有日志信息。

Logger
Handler
默认只会一句层级过滤信息,
Logger
Handler
都有
setFilter()
方法,可以指定
Filter
操作对象。

使用
logging.properties


通过
logging.properties
来设定
Logger
组态,较使用程序撰写更为方便。

15.2.1 使用ResourceBundle

ResourceBundle
的静态
getBundle()
方法会取得一个
ResourceBundle
的实例,所给定的自变量名称是信息文档的主文件名,
getBundle()
会自动找到对应的.
properties
文档,取得
ResourceBundle
实例后,可以使用
getString()
指定键来取得。

15.2.2 使用Locale

国际化的三个标准是地区
(Locale)
信息、资源包
(Resource bundle)
与基础名称
(Base name)


P471 LoggerDemo 运行结果



P474 LoggerDemo2 运行结果



P488 ReplaceDemo 运行结果



P489 SplitDemo2 运行结果



P483 SplitDemo 运行结果



P489 SplitDemo3 运行结果



遇到的问题



本章的一个代码,我在敲上去之后,并且按照书上运行的后显示了如上的错误,但是我并没有调试出来= =,这就很尴尬了。

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

本周虽然学习量相比于前几周不算多,代码也不多,而且有着之前的基础也不是很难,但是我感觉学习的压力却比以往更大,因为本周终于体会到了欠下的总是要还的这句话,因为之前用git推代码的时候,出来了错误,也没有去理她,但是本周的实验的却需要git,所以一直在忙于调试git,所以很尴尬,虽然有些时候会很累,但是不能留下尾巴,不然真的会很麻烦的。学习也是一样,如果自己不去解决遇到的问题,越拖越大,早晚一天会出现大的问题。

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标4500行25篇350小时
第一周100/1001/215/15
第二周150/2501/312/27
第三周400/6501/422/49
第四周510/11601/532/81
第五周831/19911/635/116
第六周945/19912/626/142
第七周236/22273/918/160
第八周267/24942/1118/178

参考资料

Java学习笔记(第8版)

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