20155228 2016-2017-2 《Java程序设计》第8周学习总结
20155228 2016-2017-2 《Java程序设计》第8周学习总结
教材学习内容总结
NIO与NIO2
-
NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区容量,在缓冲区中对感兴趣的数据区块进行标记,像是标记读取位置、数据有效位置,对于这些区块标记,提供了
clear()
,rewind()
,flip()
,compat()
等高级操作。 -
想要取得Channel操作对象,可以使用
Channels
类,它定义了静态方法newChannel()
,可以让你从IuputStream
、OutputStream
分别建立ReadableByteChannel
、WritableBtyteChannel
,有些InputStream
,OutputStream
实例本身也有方法可以取得Channel
实例,举例来说,FileInputStream
,FileOutputStream
都有个getChannel()
方法可以分别取得FileChannel
实例。如果你已经有相关的Channel
实例,也可以通过Channels
上的其他newxxx()
静态方法,取得InputStream
、OutputStream
、Reader
、Writer
实例。 -
Buffer
的直接子类们都有一个allocate()
静态方法,可以让你指定Bufeer
容量,buffer
是个容器,你装填的数据不会超过它的容量,buffer
的容量大小可以使用capacity()
方法取得,实际可读取或写入的数据界限索引值可以由limit()
方法得知或设定,下一个可读取数据的位置索引值,可以使用position()
方法得知或者设定。 -
NIO2文件系统API提供一组标准接口与类,应用程序开发者只要基于这些标准接口与类进行文件系统操作,底层实际如何进行文件系统操作,是由文件系统提供者负责。
-
应用程序开发者可以通过
java.nio.file
包中FileSystems
、Path
、Files
等类提供的静态方法,取得相关操作对象或者进行各种文件系统操作,这些静态方法内部会运用FileSystemProvider
来取得所需的操作对象,完成应有的操作。
通用API
-
java.util.logging
包提供了日志功能相关类与接口,不必额外配置日志组件,就可以在标准java平台使用是其好处。使用日志的起点是Logger
类,要取得Logger
实例,必须使用Logger
的静态方法getLogger()
。 -
调用
getLogger()
时,必须指定Logger
实例所属名称空间,名称空间以“.”作为层级区分,名称空间层级相同的Logger
,其父Logger
组态相同。 -
如果客户端调用了
Logger
实例的log()
方法,首先会依Level
过滤信息,再看看Logger
有无设定Fileter
接口的实例。如果有且其isLoggable()
返回ture,才会调用Handler
实例的publish()
方法,Handler
也可以设定自己的Fileter
实例,如果有其isLoggable()
返回ture,就调用Formatter
实例的format()
方法格式化信息,最会才调用输出对象将格式化后的信息输出。目前Logger
的Handler
处理完,还会传播给父Logger
的所有Hander
处理(在通过父类Logger
层次的情况下) -
可以通过
logging.properties
来设定Logger组态,启动JVM时,指定java.util.logging.config.file
系统属性为.properties
名称。 -
应用程序根据不同地区用户,呈现不同的语言、日期格式等称为本地化,如果应用程序设计时,可在不修改应用程序情况下,根据不同用户直接采用不同语言、日期格式等,这样的设计考虑称为国际化,称为i18n。
-
国际化的三个重要概念是地区信息、资源包与基础名称。地区信息的对应类是
Locale
,ResourceBundle
对象是JVM中资源包的代表对象。代表同一组信息但不同地区的各个资源包会共享相同的基础名称,使用ResourceBundle
的getBundle()
指定的名称,就是在指定基础名称。 -
使用
ResourceBundle
时,如何根据基础名称取得对应的信息文档:(1)使用指定的Locale
对象取得信息文档。(2)使用Locale.getDefault()
取得的对象取得信息文档。(3)使用基础名称取得信息文档。 -
可以使用
Data
来取得完整的日期时间,可单纯使用toString()
取得日期文字描述,或使用DataFormat
格式化日期。若查看Data
的API文件,会发现许多方法都不再建议使用,而建议改用Calendar
的相关方法取代。 -
规则表示式主要用于字符、字符串格式比较,
java.util.Pattern
实例是规则表示式在JVM中的代表对象,必须通过Pattern
的静态方法compile()
来取得,可以使用matcher()
方法指定要比较的字符串,这会返回java.util.regex.Matcher
实例,表示对指定字符串的比较器。
教材学习中的问题和解决过程
1.关于NIO和IO的区别
差异 | 解释 |
---|---|
阻塞和非阻塞 | NIO 的创建目的是为了让 Java 程序员可以实现高速 I/O 而无需编写自定义的本机代码。NIO 将最耗时的 I/O 操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。传统的IO操作属于阻塞型,严重影响程序的运行速度。 |
IO以流的方式处理数据 | 原来的 I/O 库(在 java.io.* 中) 与 NIO 最重要的区别是数据打包和传输的方式。正如前面提到的,原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。面向流 的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的 I/O 通常相当慢。 |
NIO以块的形式处理数据 | 一个面向块的I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性 |
2.常用的Java正则表达式
表达式 | 作用 |
---|---|
^[\u0391-\uFFE5]+$ |
一个或多个汉字 |
^[1-9]\d{5}$ |
邮政编码 |
^[1-9]\d{4,10}$ |
QQ号码 |
^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$ |
邮箱 |
^[A-Za-z][A-Za-z1-9_-]+$ |
用户名(字母开头 + 数字/字母/下划线) |
`^1[3 | 4 |
`^((http | https)😕/)?([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$ ` |
`^(\d{6})(18 | 19 |
代码调试中的问题和解决过程
1.如果不希望匹配整个输入到某个正则表达式,而是希望在输入中找出一个或多个匹配的子字符串。使用Matcher类的find方法来寻找下一个匹配。如果它返回True,再使用start和end方法找出匹配的范围。
while (matcher.find())
{
int start = matcher.start();
int end = matcher.end();
String match = input.substring(start, end);
. . .
}
2.当使用matches()
,lookingAt()
,find()
执行匹配操作后,就可以获得得更详细的信息。
-
start()
返回匹配到的子字符串在字符串中的索引位置。 -
end()
返回匹配到的子字符串的最后一个字符在字符串中的索引位置。 -
group()
返回匹配到的子字符串。
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("aaa2223bb");
m.find();
m.start();
m.end();
m.group();
Mathcer m2=m.matcher("2223bb");
m.lookingAt();
m.start();
m.end();
m.group();
Matcher m3=m.matcher("2223bb");
m.matches();
m.start();
m.end();
m.group();
代码托管
上周考试错题总结
1.下面哪些Linux 命令可以ASCII码和16进制单字节方法输出Hello.java的内容?
-
A .od -b -tx1 Hello.java
-
B .od -tcx1 Hello.java
-
C .od -tc -tx1 Hello.java
-
D .od -tbx1 Hello.java
-b 是以八进制输出
2.When applied to instance variables, the ________________ visibility modifier enforces encapsulation(当应用到实例变量时,____可见性修饰符强制执行封装)
-
A .static
-
B .final
-
C .public
-
D .private
-
E .none of the above(以上都不是)
The private visibility modifier guards against inappropriate data access, and therefore promotes encapsulation. Choices a and b are not visibility modifiers, and choice c is a visibility modifier that allows public access to an objects data, which violates the principle of encapsulation.
3.Which of the following objects could contain the information “eastern standard time”?(下面哪些类的对象会包含“东部标准时间”的信息)
(Choose all that apply.)
-
A .Instant
-
B .LocalDate
-
C .LocalDateTime
-
D .LocalTime
-
E .ZonedDateTime
LocalXXXX explicitly excludes time zones. Instant represents a point in time, but always uses GMT rather than the desired time zone.
结对及互评
评分标准
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
-
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
-
扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评过的同学博客和代码
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 20篇 | 400小时 | |
第一周 | 10/10 | 1/4 | 12/12 | |
第二周 | 120/130 | 1/5 | 9/21 | |
第三周 | 210/340 | 1/6 | 9/30 | |
第四周 | 460/800 | 1/7 | 9/39 | |
第五周 | 400/1200 | 1/8 | 9/48 | |
第六周 | 300/1500 | 1/9 | 9/57 | |
第七周 | 300/1800 | 2/11 | 9/66 | |
第八周 | 300/2100 | 1/12 | 9/75 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:9小时
-
实际学习时间:9小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)