教材学习内容总结

学习目标

  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. 4. java乱码处理

    //返回到jsp页面 //request.setCharacterEncoding("utf-8"); //response.setContentType("text/h ...

  2. 3. 修改myeclipse工作区间默认编码和jsp的默认编码

    1.windows - preferences - General - Workspace 2.windows - preferences - MyEclipse - Files and Editor ...

  3. angular 使用服务共享数据需要注意

    在使用服务共享数据时,需要注意一些细节,否则会出现视图不刷新,也不报错这样的问题,遇到了,总结下 如下: <div ng-controller='ctr1'> <a href={{n ...

  4. mysql 修改用户密码

    修改mysql用户密码   目录 mysqladmin命令 UPDATE user 语句 SET PASSWORD 语句 root密码丢失的情况(待验证) mysqladmin命令(回目录) 格式如下 ...

  5. VBA 选择文件

    Private Function SelectFile(ByVal strFilter As String) As String    Dim FileName As Variant     '打开文 ...

  6. 前端-CSS-4-伪类选择器&伪元素选择器

    1.伪类选择器(爱恨原则) -------------------------------------------------------------------------------------- ...

  7. Access-Control-Allow-Origin与跨域

    文章转载地址: http://freewind.me/blog/20140327/2456.html 问题 在某域名下使用Ajax向另一个域名下的页面请求数据,会遇到跨域问题.另一个域名必须在resp ...

  8. a,b = b,a 换值问题

    a = "hello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhe ...

  9. 团队作业4 Alpha冲刺

    第一天 日期:2018/6/13 1.今日完成任务情况以及遇到的问题 许征航:实现了推荐算法的基础逻辑,并按照模块化的思想对算法进行了分步整理. 遇到的问题:现有条件无法实现协同过滤算法,需要简化模型 ...

  10. Windows10系统一键结束所有运行程序

    当电脑及其卡顿的时候,想打开任务管理器关掉所有运行的程序的时候,也会变得及其困难.因此之前你如果有犀利的小程序设置,这都不会是问题. 1)空白处右键-新建-快捷方式 2)将下列代码复制到下列框中(注意 ...