教材学习内容总结

学习目标

  1. 了解NIO

  2. 会使用Channel、Buffer与NIO2

  3. 会使用日志API、国际化

  4. 会使用正则表达式

  5. 了解JDK8增强功能

第14章 NIO与NIO2

14.1 认识NIO

(1)NIO概述

NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以设定缓冲区(Buffer)容量,在缓冲区中对感兴趣的数据区块进行标记,像是标记读取位置、数据有效位置,对于这些区块标记,提供了clear()、rewind()、flip()、compact()等高级操作。

下面用NIO的方法来实现10.1.1中的dump()方法,代码如下:

public static void dump(ReadableByteChannel src,WritableByteChannel dest)throws IOException{
ByteBuffer buffer = ByteBuffer.allocate(1024);
try(ReadableByteChannel srcCH = src;WritableByteChannel destCH = dest){
while(srcCH.read(buffer)!=-1){
buffer.flip();
destCH.write(buffer);
buffer.clear();
}
}
}

(2)Channel架构与操作

Channel接口是AutoClosable的子接口,主要是增加了isOpen()方法来确认Channel是否开启,下图为Channel的继承架构:

ReadableByteChannel定义了read()方法负责将ReadableByteChannel中的数据读取至ByteBuffer;

WritableByteChannel定义了write()方法,负责将ByteBuffer的数据写到WritableByteChannel中;

ScatteringByteChannel定义了read()方法,负责将ScatteringByteChannel分配到ByteBuffer数组中;

GatheringByteChannel定义了write()方法,负责将ByteBuffer的数据写到GatheringByteChannel中。

要想取得Channel的操作对象,可以使用Channels类。

(3)Buffer架构与操作

Buffer是个抽象类,定义clear()、flip()、reset()、rewind()等对数据区域块的高级操作,操作的返回类型均为Buffer,所以在连续高级操作时,可形成管线操作风格。Buffer的类继承架构如下图所示:

可根据不同的数据类型处理需求来选择不同的的Buffer子类,他们都是抽象类,不能直接实例化。Buffer的所有直接子类们都有个allocate()静态方法,可以让你指定Buffer容量(Capacity)。Buffer是个容器,填装的数据不会超过它的容量。

14.2 NIO2文件系统

NIO2文件系统API提供一组标准接口与类,应用程序开发者只要基于这些标准接口与类进行文件系统操作,底层实际如何进行文件系统操作,是由文件系统提供者负责(由厂商操作)。

应用程式开发者可以通过java.nio.file套件中FileSystems、Paths、Files等类提供的静态方法,取得相关操作对象或进行各种文件系统操作,这些静态方法内部会运用FileSystemProvider来取得所需的操作对象,完成应有的操作。

第15章 通用API

15.1 日志

(1)日志API简介

java.util.logging包提供了日志功能相关类与接口,Logger类的构造函数标示为protected,不是java.util.logging同包的类不能直接以new创建,要取得Logger实例,必修使用Logger的静态方法getLogger()。取得Logger实例后,可用log()方法输出信息,输出时可用Level的静态成员制定信息层级(Level)。具体的代码实例如下:

public class LoggerDemo {
public static void main(String[] args) {
Logger logger = Logger.getLogger(LoggerDemo.class.getName()); logger.log(Level.WARNING, "WARNING信息");
logger.log(Level.INFO, "INFO信息");
logger.log(Level.CONFIG, "CONFIG信息");
logger.log(Level.FINE, "FINE信息");
}
}

运行结果如下:

(2)指定日志层级

Logger与Handler预设都会先依Level过滤信息,如果没有做任何修改,取得的Logger实例之父Logger组态,就是Logger.GLOBAL_LOGGER_NAME名称空间Logger实例的组态,这个实例的Level设定为INFO,可通过Logger实例的getParent()取得父Logger实例,可通过getLevel()取得设定的Level实例。

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

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

public class LoggerDemo2 {
public static void main(String[] args) {
Logger logger = Logger.getLogger(LoggerDemo2.class.getName());
logger.setLevel(Level.FINE);
for(Handler handler : logger.getParent().getHandlers()){
handler.setLevel(Level.FINE);
} logger.log(Level.WARNING, "WARNING信息");
logger.log(Level.INFO, "INFO信息");
logger.log(Level.CONFIG, "CONFIG信息");
logger.log(Level.FINE, "FINE信息");
}
}

运行结果如下:

这样FINE级及以上的log均能打印出来。

(3)使用Handler与Formatter

Handler负责日志输出。Logger可以使用addHandler()新增Handler实例,使用removeHandler()移除Handler。

Logger与Handler默认只会根据层级过滤信息。Logger与Handler都有setFilter()方法,可以指定Filter操作对象,当然也可以添加额外的过滤条件来操作Filter接口。

15.2 国际化基础

在不修改应用程序情况下,根据不同用户直接采用不同语言、日期格式等,这样的设计考虑称为国际化,简称i18n。

(1)使用ResourceBundle

对于以后可能变动的文字信息,可考虑将信息移至程序外,方法是使用ResourceBundle来完成信息绑定。

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

(2)使用Locale

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

地区信息的对应类是Locale,在建立Locale实例时,可指定语言编码与地区编码,例如,建立代表台湾繁体中文的Locale,例如:

Locale locale = new Locale("zh","TW");

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

15.3 规则表达式

(1)规则表示式简介

规则表达式基本上包括两种字符:字面意义字符和元字符。字面意义字符是指按照字面意义比较的字符;元字符时不按照字面比较,在不同情境有不同意义的字符。

例如使用String的split()方法返回切割后各字符串组成的String数组。

  • 字面意义字符

字母和数字在规则表示式中都是按照字面意义比较的,有些字符之前加上\之后会被当做元字符。

元字符在规则表示式中有特殊意义,比较标点时可以在每个符号前加上\。

  • 字符类

规则表示式中,多个字符可以分归在一起,成为一个字符类,会比较文字中是否有任一个字符符合字符类中某个字符。

归类字符的方式之一是将字符放于[]中。

  • 贪婪、逐步、独吐量词

{n}是贪婪量词表示法的一种,表示前面的量词出现n次,会尽可能找出长度最长的符合文字。

在贪婪量词表示法后加上?,将会成为逐步量词,会尽可能找出长度最短的符合文字。

在贪婪量词表示法后加上+,将会成为独吐量词,没有任何文字符合。

  • 边界比较

边界比较用来表示文字必须符合指定的边界条件,也就是定位点,因此这类表示式也常称为锚点。

  • 分组与参考

可以使用()来将规则表示式分组,除了作为子规则表示式之外,还可以搭配量词使用。

分组回头参考时,是在\后加上分组计数,表示参考第几个分组的比对结果 。

(2)Pattern与Matcher

在程序中使用表示式,必须先针对规则表示式做剖析、验证等动作,确定规则表示式语法无误,对字符串进行比较。

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

15.4 JDK8 API增强功能

(1)StringJoiner、Arrays新增API

String新增join()静态方法可以指定每个字符串间以逗号分隔进行连接。

Arrays上新增parallelPrefix()、parallelSetAll()与parallelSort()方法.

(2)Stream相关API

若想对数组进行管线化操作,方法一是使用Arrays的asList()方法返回List,而后调用stream()方法取得Stream实例;另一个方法是使用Arrays的stream()方法,可以指定数组后返回Stream实例。

CharSequence上新增了chars()和codePoints()方法,都是返回intStream。

Math在JDK8中也新增了不少数学运行相关API。

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

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

在本次代码运行中没有发现什么问题。

本周代码托管截图

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第二周 200/400 1/3 12/52
预备作业 0/400 1/4 15/67
第三周 500/900 1/5 10/77
第四周 500/1500 1/6 15/92
第五周 500/2000 1/7 20/112
第六周 500/2500 2/9 20/132
第七周 500/3000 2/11 30/162
第八周 500/2000 2/13 20/182

20145226夏艺华 《Java程序设计》第8周学习总结的更多相关文章

  1. 20145226夏艺华 JAVA预备作业1

    博客阅读总结 关于师生关系: 学生和老师之间我觉得关系时多元化的,不能拘泥于单独的一种关系:灌输与被灌输,教授与被教授--我认为,在不同的课程阶段,师生之间的关系都可以发生变化.前期的老师更像是一个指 ...

  2. 20145226夏艺华 《Java程序设计》实验报告四

    实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试 了解Android组件.布局管理器的使用 掌握Android中事件处理机制 Andro ...

  3. 20145226夏艺华 网络对抗技术 EXP9 web安全基础实践

    20145226夏艺华 网络对抗技术 EXP9 web安全基础实践 !!!免考项目:wannacry病毒分析+防护 一.实验后回答问题 SQL注入攻击原理,如何防御 攻击原理 "SQL注入& ...

  4. 20145226夏艺华 网络对抗技术EXP8 WEB基础实践

    20145226夏艺华 网络对抗技术EXP8 WEB基础实践 实验问题回答 1.什么是表单? 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CG ...

  5. 20145226夏艺华 网络对抗技术 EXP7 网络欺诈技术防范

    20145226夏艺华 网络对抗技术 EXP7 网络欺诈技术防范 实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. · 简单应用SET工具建立冒名网站 · ett ...

  6. 20145226夏艺华 Exp6 信息搜集与漏洞扫描

    20145226夏艺华 Exp6 信息搜集与漏洞扫描 基础问题回答 哪些组织负责DNS,IP的管理? · 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和IP地址管理 ...

  7. 20145226夏艺华 网络对抗技术EXP4 恶意代码分析

    20145226夏艺华 网络对抗技术EXP4 恶意代码分析(未完成版) 回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作 ...

  8. 20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

    20145226夏艺华<网络对抗>第一次实验拓展:shellcode注入+return-to-libc shellcode注入实践 编写shellcode 编写shellcode已经在之前 ...

  9. 20155312 2016-2017-2 《Java程序设计》第九周学习总结

    20155312 2016-2017-2 <Java程序设计>第九周学习总结 课堂内容总结 两个类有公用的东西放在父类里. 面向对象的三要素 封装 继承 多态:用父类声明引用,子类生成对象 ...

  10. 20155213 2016-2017-2 《Java程序设计》第九周学习总结

    20155213 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC(Java DataBase Connectivity)即java数据库连 ...

随机推荐

  1. VMware vCenter Server 6.5.0 U1g

    VMware vCenter Server 6.5.0 U1gName: VMware-VCSA-all-6.5.0-8024368.iso Release Date: 2018-03-20 Buil ...

  2. docker使用笔记1

    rhel6安装 yum -y install docker-io ################################################ 进入容器命令 docker exec ...

  3. 29. 在Linux上使用unzip解压以默认编码解压,中文文件名会出现乱码

    解决办法: 下载p7zip-9.13-1.el5.rf.x86_64.rpm和p7zip-plugins-9.13-1.el5.rf.x86_64.rpm包 用以下方法安装后,使用7z x filen ...

  4. jssip中文开发文档(完整版)

    jsSip开发文档 (官网地址:http://www.jssip.net/) 完整案例demo下载地址: http://download.csdn.net/download/qq_39421580/1 ...

  5. CentOs - 使用ssh key远程登录

    环境: 服务器端CentOs,本地OS X 服务器端: 1. 安装openssl使实现ssl协议 2. 将本地的pub key加入信任列表 本地: 1. 生成pub key 2. 配置ssh别名使登陆 ...

  6. MS sql 无法进行事务日志备份

    问题出在:恢复模型没有设置好我们之所以要备份数据库和事务日志都是为了以防万一,用来恢复.还原数据库的,因此恢复模型必须设置好,在sql server中默认的恢复模型为"简单".一般 ...

  7. UI5-文档-4.32-Routing with Parameters

    现在我们可以在overview和detail页面之间导航,但是我们在overview中选择的实际项目还没有显示在detail页面上.我们的应用程序的一个典型用例是在详细信息页面上显示所选项目的附加信息 ...

  8. Git----分支管理之创建与合并分支02

    在版本回退里,你已经知道 ,每次提交,Git都把它们串i成一条时间线,这条时间线就是一个分支,截至到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支,HEAD严格来说不是指向提交 ...

  9. iPhone launch screen,self.view.frame.size

    在工程文件中找到以下设置 "Launch Screen File"只支持iOS8以上版本,如果用之,则self.view.frame.size返回的结果为正常的当前view尺寸. ...

  10. VC 判断网络连接函数

    IsNetworkAlive Bool IsNetworkAlive( _Out_  LPDWORD lpdwFlags ); Header Sensapi.h Library Sensapi.lib ...