20145233韩昊辰 第八周总结
20145233 《Java程序设计》第8周学习总结
教材学习内容总结
一、NIO和NIO2
1.NIO的定义
InputStream、OutputStream的输入输出,基本上是以字节为单位进行低层次处理,虽然需要直接面对数组,但实际上多半是对字节数组中整个区块进行处理。dump()方法是整块数据读入后又整块数据写出。
2.NIO2的定义
现今世界上存在着各式各样的文件系统,不同的文件系统会提供不同的存取方式,文件属性,权限控制等操作。在JDK7出现以前,常需要对特定的文件撰写特定的程序,不仅撰写方式没有标准,针对特定功能撰写的程序也会增加应用程序开发者的负担。
NIO2文件系统API提供一组标准类接口与类,应用程序开发者只要基于这些标准接口与类进行文件系统操作,底层实际如何进行文件系统的操作,是由文件系统提供者负责。
二、通用API
1.日志API
-
java.util.logging包提供了日志功能相关类与接口,使用日志的起点是logger类,Logger类的构造函数标示为protected,不是java.util.logging同包的类不能直接以new创建,必许使用Logger的静态方法,如:
Logger logger = Logger.getLogger("cc.openhome.Main")。
-
取得Logger的方式:
Logger logger = Logger.getLogger("Main.class.getName")
。 -
名称空间层级相同的Logger,父Logger组态会相同,每个Logger处理完自己的日志动作后,会向父Logger传播,让父Logger也可以处理日志。
2.指定日志层级
-
取得的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实例数组。
下面这个是书上474的例子:
-
在没有做任何组态设定的情况下,取得的Logger实例,只会使用
Logger.GLOBAL_LOGGER_NAME
名称空间Logger实例拥有的Handler,默认是使用ConsoleHandler
,为Handler的子类,作用是在控制台下输出日志信息,,默认地层级是Level.INFO
。
3.使用Handler与Formatter
-
MemoryHandler
不会格式化日志信息,信息会暂存于内存缓冲区,直至超过大小才将信息输出至指定的目标Handler。 -
StreamHandler
可自行指定信息输出时使用的OutputStream
实例,它与子类都会使用指定的Formatter格式化信息。 -
ConsoleHandler
创建时,会自动指定OutputStream为System.err
,所以日志信息会显示在控制台。 -
FileHandler
创建时会建立日志输出时使用的FileOutputStream
,文档位置与名称可以使用模式字符串指定。 -
SocketHandler
创建时可以指定主机位置与端口,内部将自动建立网络联机,将日志信息传送至指定的主机。 -
Logger可以使用
addHandler()
新增Handler实例,使用removeHandler()
移除Handler。 -
在建立
FileHandler
指定模式字符串时,可以使用“%h”来表示用户的根目录,还可以使用“%t”取得系统暂存目录,或者使用“%g”自动为文档编号。
4.Pattern与Matcher
-
在程序中使用表示式,必须先针对规则表示式做剖析、验证等动作,确定规则表示式语法无误,对字符串进行比较。
-
java.util.regex.Pattern实例是规则表示式在JVM中的代表对象,Pattern的构造函数被标示为private,必须通过Pattern的静态方法compile()来取得。
-
在取得Pattern的实例后,可以使用split()方法将指定字符串依规则表示式切割,效果等于使用String的split()方法。
5.自定义Handler、Formatter与Filter
-
如果java.util.logging包中提供的Handler成果都不符合需求,可以继承Handler类,操作抽象方法publish()、flush()与close()方法来自定义Handler,建议操作时考虑信息过滤与格式化。
-
Handler是负责输出,格式化交由Formatter,信息过滤是交由Filter。
-
自定义Formatter,可以继承Formatter后操作抽象方法format(),这个方法会传入LogRecord,储存所有日志信息。
-
1.
JDK8 API增强功能
StringJoiner、Arrays新增API
1.String,join()、StringJoiner
- String新增join()静态方法可以指定每个字符串间以逗号分隔进行连接。
2.Arrays
- Arrays上新增parallelPrefix()、parallelSetAll()与parallelSort()方法。
- parallelPrefix()方法,可以指定xxxBinaryOperator实例,执行类似Stream的reduce()过程。
- parallelSetAll()方法,用来对数组进行初始化或全面重设每个索引元素。
- parallelSort()方法,可以将指定的数组分为子数组并以平行化方式分别排序,然后再进行合并排序。
Stream相关API
1.Files上有lines()、list()、walk()等方法。
规则表达式
-
字面意义字符是指按照字面意义比较的字符。
-
元字符时不按照字面比较,在不同情境有不同意义的字符。
-
java.util.regex.Pattern
实例是规则表达式在JVM中的代表对象,Pattern的构造函数被标示为private,通过Pattern的静态方法compile()
来取得。Pattern.compole()
方法的另一版本,可以指定旗标(Flag)。 -
在取得Pattern实例后,可使用方法:
split()
方法:将指定字符串依规则表达式切割
matcher()
方法:指定要比较的字符串
find()
方法:看看是不是有下一个符合字符串
lookingAt()
:看看字符串开头是否符合规则表达式
group()
:可以返回符合的字符串。 -
在取得Matcher实例后,可使用方法:
replaceAll()
可以将符合规则表达式的部分以指定的字符串取代
replaceFirst()
取代首个组合规则表达式的部分
replaceEnd()
取代最后符合规则表达式的部分
start()
方法可以取得符合字符串的初始索引
end()
方法可以取得符合字符串最后一个字符后的索引
教材学习中的问题和解决过程
这一章的内容还是比较少的,并且有很多新的东西,但是在理解方面,并没有前面的概念性的知识难理解,在将书上的代码敲过一些之后,对于这些内容就有了很好地理解, 只是书上的知识点还是蛮多的,这就需要我们花费大量的时间去理解。
在474中的这个代码,提到了12章Lambda的内容,在JDK8之后,这里提到的几个方法也多了重载版本,可以接受Supplier实例,如果日志比较耗费资源的话,就可以如下撰写,这样层级不道德时候,就不会执行expansiveLogging()。
代码调试中的问题和解决过程
没有在书上的代码中发现什么有错的地方。
本周代码托管截图
在这里我解释一下,因为我用的是idea的git,很方便,所以我没有写一个传一个,在idea里面的没有传过的代码是绿色的,而传过的代码在里面会变成黑色的,但是这个代码如果被修改过,又会重新变成蓝色,传过之后又会变成黑色的。
其他(感悟、思考等,可选)
这周的学习任务跟上一周比又复杂了一些,上一周的时间是比较简单的,这周中又讲解了很实用的通用API,并且理解了java中日志的一些功能,十四章的内容因为是大概了解,我也看了下书,介绍了两种文件系统,虽然我不是很清楚这是干什么用的,但是我觉得以后肯定有用到,这周进行了第三次试验,再没了解前,还是觉得蛮复杂的,因为开始以为还要实现一个复杂的java游戏,其实老师这是想让我们仔细掌握git的使用方法,这也是要学会的。
因为普通传代码的方式和实验不同,我需要不断地更改两个上传的位置,这也是蛮简单的,也让我对idea中的git有了更深的理解。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4000行 | 24篇 | 350小时 | |
第一周 | 150/150 | 2/2 | 15/15 | |
第二周 | 200/350 | 2/4 | 20/35 | |
第三周 | 350/700 | 2/6 | 30/65 | |
第四周 | 500/1200 | 1/7 | 35/100 | |
第五周 | 1100/2300 | 1/8 | 30/130 | |
第六周 | 1000/3300 | 2/10 | 30/160 | |
第七周 | 600/3900 | 2/12 | 25/185 | |
第八周 | 400/4300 | 2/14 | 25/210 |