20145216 《Java程序设计》第8周学习总结

教材学习内容总结

第十五章 通用API

15.1 日志

  • java.util.logging 包提供了日志功能相关类与接口,不必额外配置日志组件,就可在标准Java平台使用是其好处。使用日志的起点是Logger类,要取得Logger实例,必须使用Logger的静态方法getLogger()。如:

    Logger logger = Logger.getLogger("cc.openhome.Main");
  • 调用getLogger()时,必须指定Logger实例所属名称空间,名称空间以“.”作为层级区分,名称空间层级相同的Logger,其父Logger组态相同。

  • Logger是记录信息的起点,要输出的信息,必须先通过Logger的Level与Filter过滤,再通过Handler的Level与Filter过滤,格式化信息的动作交给Formatter,输出信息的动作实际上是Handler负责。

  • 负责日志输出的是Handler实例,Handler的子类有MemoryHandler和StreamHandler,StreamHandler的子类有ConsoleHandler、FileHandler和SocketHandler。

  • Formatter的子类有XMLFormatter和SimpleFormatter,FileHandler默认的Formatter是XMLFormatter,ConsoleHandler默认则使用SimpleFormatter。

  • 如果要自定义Handler,可以继承Handler类,操作抽象方法publish()、flush()、close()。

  • 如果要自定义Formatter,可以继承Formatter后操作抽象方法formatter(),这个方法会传入LogRecord,储存所有日志信息。例如,将ConsoleHandler的Formatter设定为自定义的Formatter:

    import java.time.Instant;
    import java.util.logging.*; public class FormatterDemo {
    public static void main(String[] args) {
    Logger logger = Logger.getLogger(FormatterDemo.class.getName());
    logger.setLevel(Level.CONFIG);
    ConsoleHandler handler = new ConsoleHandler();
    handler.setLevel(Level.CONFIG);
    handler.setFormatter(new Formatter() {
    @Override
    public String format(LogRecord record) {
    return "日志来自 " + record.getSourceClassName() + "."
    + record.getSourceMethodName() + "\n"
    + "\t层级\t: " + record.getLevel() + "\n"
    + "\t信息\t: " + record.getMessage() + "\n"
    + "\t时间\t: " + Instant.ofEpochMilli(record.getMillis())
    + "\n";
    }
    });
    logger.addHandler(handler);
    logger.config("自定义 Formatter 信息");
    }
    }
  • 可以通过logging.properties来设定Logger组态,启动JVM时,指定java.util.logging.config.file系统属性为.properties名称。

15.2 国际化基础

  • 对于日后可能变动的文字信息,可以考虑将信息移至程序之外,方法是使用ResourceBundle来做信息绑定。首先要准备一个.properties文档,如messages.properties,而文档内容如下:

    cc.openhome.welcome=Hello
    cc.openhome.name=World
  • .properties文档必须放置在CLASSPATH的路径设定下,文档中撰写的是键/值配对,之后在程序中可以使用键来取得对应的值。例如:

    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") + "!");
    }
    }
  • ResourceBundle的静态getBundle()方法会取得一个ResourceBundle的实例,所给定的自变量名称是信息文档的主文件名,getBundle()会自动找到对应的.properties文档,取得ResourceBundle实例后,可以使用getString()指定键来取得文档中对应的值,如果日后想要改变现实的信息,只要改变.properties文档的内容就可以了。范例执行结果如下:

  • 国际化的三个重要概念是地区信息、资源包与基础名称。地区信息的对应类是Locale,ResourceBundle对象是JVM中资源包的代表对象。代表同一组信息但不同地区的各个资源包会共享相同的基础名称,使用ResourceBundle的getBundle()时指定的名称,就是在指定基础名称。

  • 地区信息代表了特定的地理、政治或文化区,地区信息可由一个语言编码与可选的地区编码来指定。其中语言编码由两个小写字母代表,如zh表示中文;地区编码则由两个大写字母表示,如TW表示我国台湾。

  • 使用ResourceBundle时,如何根据基础名称取得对应的信息文档:

    (1)使用指定的Locale对象取得信息文档。
    (2)使用Locale.getDefault()取得的对象取得信息文档。
    (3)使用基础名称取得信息文档。

15.3 规则表达式

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

  • 规则表示式主要用于字符、字符串格式比较,java.util.regex.Pattern实例是规则表示式在JVM中的代表对象,必须通过Pattern的静态方法compile()来取得,可以使用matcher()方法指定要比较的字符串,这会返回java.util.regex.Matcher实例,表示对指定字符串的比较器。

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

问题:

在参考老师的《Java学习笔记》学习指导博客时,针对P481 Hello.java提出的问题(如下)有疑惑:

  • messages.properties放什么位置?

  • 研究ResourceBundle类。

解决过程:

通过学习教材,得到如下解释:

  • properties文档必须放置在CLASSPATH的路径设定下。

  • ResourceBundle的静态getBundle()方法会取得一个ResourceBundle的实例,所给定的自变量名称是信息文档的主文件名,getBundle()会自动找到对应的.properties文档,取得ResourceBundle实例后,可以使用getString()指定键来取得文档中对应的值,如果日后想要改变现实的信息,只要改变.properties文档的内容就可以了。

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

问题:

在敲书上P481页的I18N Hello.java代码范例时,运行结果产生错误,如图所示:

解决过程:

通过仔细看书上的内容,发现自己少做了重要的一步:建立一个.properties文档,于是我按照书上所说建立了一个messages.properties文档,文档内容如下:

cc.openhome.welcome=Hello
cc.openhome.name=World

再次运行程序,得到正确结果:

其他(感悟、思考等,可选)

上周的学习任务我没有完成好,本周我吸取了经验教训,再也不抱着侥幸心理偷懒了,认真学习了第十五章,并且也简单地了解了第十四章的内容,对于使用git托管代码,也终于学会了,发现上传起来真的很方便,以前总认为直接通过复制粘贴上传代码很容易,不愿去学如何使用git托管代码,但是真正学会了以后,就能发现git的好处与优点。

代码托管截图

学习进度条

  代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 4500行 30篇 350小时 能将java运用自如 
第一周 150/150 2/2 15/15 学习了与java相关的基础知识 
第二周 200/350 1/3 20/35

学习了java的基本语法

 第三周  450/800  1/4 25/60 

学习了对象和封装的相关知识

 第四周 687/ 1487  1/5 30/90 

学习了继承与接口的相关知识

 第五周 803/2290    1/6    30/120 

学习了异常处理以及Collection与Map的相关知识

 第六周  910/3200 2/8  40/160 

学习了输入、输出和线程的相关知识

 第七周  350/3550 2/10  30/190 

学习了时间与日期的相关知识

 第八周 350/3900  2/12   30/220

学习了通用API的相关知识

参考资料

20145216史婧瑶《Java程序设计》第8周学习总结的更多相关文章

  1. 20145216史婧瑶《网络对抗》Web安全基础实践

    20145216史婧瑶<网络对抗>Web安全基础实践 实验问题回答 (1)SQL注入攻击原理,如何防御 攻击原理: SQL注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些 ...

  2. 20145216史婧瑶《网络对抗》Web基础

    20145216史婧瑶<网络对抗>Web基础 实验问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签.表单域.表单按钮. (2)浏览器可以 ...

  3. 20145216史婧瑶 《网络对抗》 MSF基础应用

    20145216史婧瑶 <网络对抗> MSF基础应用 实验回答问题 用自己的话解释什么是exploit,payload,encode. exploit:渗透攻击模块,测试者利用它来攻击一个 ...

  4. 20145216史婧瑶《网络对抗》逆向及Bof进阶实践

    20145216史婧瑶<网络对抗>逆向及Bof进阶实践 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢 ...

  5. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  6. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  7. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  8. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  9. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  10. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

随机推荐

  1. 【BZOJ2525】[Poi2011]Dynamite 二分+树形DP

    [BZOJ2525][Poi2011]Dynamite Description Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有 ...

  2. 【BZOJ4832】[Lydsy2017年4月月赛]抵制克苏恩 概率与期望

    [BZOJ4832][Lydsy2017年4月月赛]抵制克苏恩 Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q同学会告诉 ...

  3. HighCharts使用心得(转载)

    转载自:http://www.cnblogs.com/Olive116/p/3777021.html 1.  准备工作------下载HighCharts插件 跟ECharts一样,HighChart ...

  4. Java使用Apache POI进行Excel导入和导出

    Manve依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> ...

  5. Vue-cli 安装使用和理解

    Vue 的 官方文档 提到 点开这个链接,跟着文档一步步直到: $ npm install -g vue-cli $ vue init webpack my-project $ cd my-proje ...

  6. 160613、MyBatis insert操作返回主键

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能,针对Sequence主键而言,在执行 ...

  7. 160517、nginx负载均衡详解

    1:什么是负载均衡 负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用.最大化吞吐率. ...

  8. 关于如何将Eclipse中@author进行修改的解决方法

    问题:Eclipse和 MyEclipse上的文档注释"/**"里面的"@author Administrator"是自动生成的姓名,有时我们需要将自己的代码进 ...

  9. Tips-Windows 10【多桌面视窗】操作

    Windows 10[多桌面视窗] 当你点击任务栏上的“task view”按键时,会在屏幕中间显示你当前正在使用的桌面,你可以点击“添加桌面”来创建一个新的桌面,在这个新的桌面你可以打开其他的应用程 ...

  10. 在VisualStudio 2013下使用VS2012的插件

    由于VS2013刚刚推出,而VS的插件又是和版本强相关的,因此VS2013就存在一个插件比较少的问题.虽然2013相对与2012来说改动并不大,应该是拿来重新编译一番就可以使用了.但也得有一个过程,并 ...