20145232 韩文浩 《Java程序设计》第8周学习总结
教材学习内容总结
14 NIO与NIO2
NIO使用频道(channel)来衔接数据节点,对数据区的标记提供了
clear()
,rewind()
,flip()
,compact()
等高级操作。想要取得channel的操作对象,可以使用channels类。
Buffer的直接子类们都有一个allocate()静态方法,可以让你指定Buffer容量。
Buffer的容量大小可以使用capacity()方法取得。
在以前,并没有标准方式取得不同文件系统所支持的不同属性,在JDK7中,可以通过
BasicFileAttributes
,DosFileAttributes
,PosixFileAttributes
,可以针对不同的文件系统取得支持的属性信息。NIO2文件系统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字符串指定。
* 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 国际化基础
**使用ResourceBundle**
* 对于日后可能变动的文字信息,可以考虑将信息移至程序之外,方法是使用ResourceBundle来做信息绑定。
准备一个.properties文档,如messages.properties,文档内容如下:
cc.openhome.welcome=Hello
cc.openhome.name=World
import static java.lang.System.out;
import java.util.ResourceBundle;
public class Hello {
public static void main(String[] args) {
ResourceBundle res = ResourceBundle.getBundle("messages");
out.print(res.getString("cc.openhome.welcome") + "!");
out.println(res.getString("cc.openhome.name") + "!");
}
}
```
以后想改变显示的信息,只要改变.properties文档的内容就可以了。
- ResourceBundle的静态getBundle()方法会取得一个ResourceBundle实例,所给定的自变量名称是信息文档的主文件名。
使用Locale
- 使用ResourceBundle时,如何根据基础名称取得对应的信息文档:
(1)使用指定的Locale对象取得信息文档
(2)使用Locale.getDefault()取得的对象取得信息文档
(3)使用基础名称取得信息文档
15.3 规则表达式
- 字面意义字符是指按照字面意义比较的字符。
元字符时不按照字面比较,在不同情境有不同意义的字符。
java.util.regex.Pattern实例是规则表达式在JVM中的代表对象,Pattern的构造函数被标示为private,通过Pattern的静态方法
compile()
来取得。Pattern.compole()方法的另一版本,可以指定旗标(Flag)。在取得Pattern实例后,可使用方法:
split()方法
:将指定字符串依规则表达式切割
matcher()方法
:指定要比较的字符串
find()方法
:看看是不是有下一个符合字符串
lookingAt()
:看看字符串开头是否符合规则表达式
group()
:可以返回符合的字符串。- 在取得Matcher实例后,可使用方法:
replaceAll()
可以将符合规则表达式的部分以指定的字符串取代
replaceFirst()
取代首个组合规则表达式的部分
replaceEnd()
取代最后符合规则表达式的部分
start()方法
可以取得符合字符串的初始索引
###15.4 JDK8 API增强功能
* JDK8中,String新增了join()静态方法可以直接使用
String message = String.join("-","Java","is","cool");
```
会产生“Java-is-cool”
- JDK8中,针对大型数组的平行化操作,在Arrays上新增了一些方法。
parallelPrefix()方法
可以指定XXXBinaryOperator实例,执行类似Stream的reduce()方法。
parallelSetAll()方法
用来对数组进行初始化或全面重新设置每个索引元素。
parallelSort()方法
可以将指定的数组分为子数组并以平行化当时分别排序。
教材学习中的问题和解决过程
p471 LoggerDemo.java: 测试Logger
p474 LoggerDemo2.java: 测试Level
p477 Formatter.java: 自定义Formatter
p483 SplitDemo.java
本周代码托管截图
其他(感悟、思考等,可选)
这周主要学习了第15章,14章只是简单看了看没有花太多时间。需要理解的东西还是挺多的,下周还要多花些时间
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4000行 | 16篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 1/3 | 25/45 | |
第三周 | 500/1000 | 1/4 | 40/85 | |
第四周 | 800/1800 | 1/5 | 45/130 | |
第五周 | 700/2500 | 1/6 | 43/173 | |
第六周 | 700/3200 | 1/7 | 48/221 | |
第七周 | 400/3600 | 1/8 | 39/260 | |
第八周 | 400/4000 | 1/9 | 40/300 |
参考资料
20145232 韩文浩 《Java程序设计》第8周学习总结的更多相关文章
- 《Java程序设计》第二周学习总结
20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...
- 20155213 2016-2017-2 《Java程序设计》第二周学习总结
20155213 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 关于Unicode和UTF 很抱歉,没能读完娄老师推荐的网址,关于Unicode和UTF的介 ...
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145330孙文馨 《Java程序设计》第一周学习总结
20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...
- 20145337 《Java程序设计》第九周学习总结
20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
- 20145236 《Java程序设计》第九周学习总结
20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...
- 学号 20175212 《Java程序设计》第九周学习总结
学号 20175212 <Java程序设计>第九周学习总结 教材学习内容总结 一.MySQL数据库管理系统 1.在官网上下载并安装MySQL 2.在IDEA中输入测试代码Connectio ...
- 20165223《JAVA程序设计》第二周学习总结
20165223 <JAVA程序设计>第二周学习总结 教材学习内容总结 第二章要点 标识符与关键字 基本数据类型 类型转换运算 输入输出数据 数组 第三章要点 运算符与表达式 语句概述 i ...
随机推荐
- C#执行javascript代码,执行复杂的javascript代码新方式
1. 使用nuget 包"Jurassic", 注意,如果 nuget上的包 用起来出现错误,请自行下载 github代码,自行编译最新代码成dll,再引用. 官方的nuget包 ...
- Android开发之利用ViewPager实现在Activity或Fragment中引入别的布局文件实现滑动并进行页面跳转
有些时候经常可以看到其他APP中有一排的图标,可以在一个界面中滑来滑去,并且图标可以进行点击事件进行页面的跳转.这里对这种方法的实现做出总结. 首先看一下图片: 下面这两种图片是在一个Fragment ...
- ListView的自定义适配器及其优化(listView序号混乱问题的处理)
ListView是最常使用的android组件之一,关于listView的优化问题刚刚了解了一些,在这里做出总结. PS:如果想让ListView中的item根据数据内容显示item的大小,需要在it ...
- Mercedes offline programming/coding tips and guides
Mercedes offline programming/coding recommendations and guides: Offline coding: SCN or CVN coding wa ...
- centos 6.5 上安装 nvm
NVM 重磅推出NVM curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash Clos ...
- SQL Server 2008设置sa用户并开启远程连接
1.打开SQL Server Management Studio,以windows身份登录数据库
- 干货分享,40个photoshop技能送给你!
自从有了“PS(Photoshop)”以后,很多事情变成了可能,你可以上九天揽月,也可以下五洋捉鳖,照片中,你可以出现在任何你想在的地方.而最基本的美化照片的功能,我想是很多同学学习PS的初衷.当你掌 ...
- 10个办法让设计小白迅速get海报设计要点!
对于设计师而言,海报和宣传单的设计,几乎是每一个设计师的必修课.如今网页上的 Banner.宣传和促销的数字海报,大多脱胎于我们所熟知的海报设计. 对于推销产品.连接客户,海报始终是一种最为有趣和实用 ...
- PhpStorm 不停地 updating indices
问题描述: 环境:PhpStorm 框架: Laravel 5.0, php artisan make:test bar.foo 之后,PhpStorm 一直不停地 Updating indices ...
- wepy - 小程序开发框架
2017-09-23 运行命令. wepy build --watch 2017-11-06 wepy一直用的1.5.8,同事有一次安装了最新的1.6.0就报错了... unexpected char ...