20145216史婧瑶《Java程序设计》第8周学习总结
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周学习总结的更多相关文章
- 20145216史婧瑶《网络对抗》Web安全基础实践
20145216史婧瑶<网络对抗>Web安全基础实践 实验问题回答 (1)SQL注入攻击原理,如何防御 攻击原理: SQL注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些 ...
- 20145216史婧瑶《网络对抗》Web基础
20145216史婧瑶<网络对抗>Web基础 实验问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签.表单域.表单按钮. (2)浏览器可以 ...
- 20145216史婧瑶 《网络对抗》 MSF基础应用
20145216史婧瑶 <网络对抗> MSF基础应用 实验回答问题 用自己的话解释什么是exploit,payload,encode. exploit:渗透攻击模块,测试者利用它来攻击一个 ...
- 20145216史婧瑶《网络对抗》逆向及Bof进阶实践
20145216史婧瑶<网络对抗>逆向及Bof进阶实践 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢 ...
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 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可以 ...
随机推荐
- 【BZOJ2827】千山鸟飞绝 hash+堆+SBT
[BZOJ2827]千山鸟飞绝 Description 话说有一天doyouloveme和vfleaking到山里玩.谁知doyouloveme刚刚进山,所有的鸟儿竟被他的神犇气场给惊得全部飞走了.v ...
- [Jenkins] Manage Jenkins from Web Interface
URL 说明 [jenkins_url]/safeRestart This will restart Jenkins after the current builds have completed. ...
- jQuery Mobile 总结
转载 孟祥月 博客 http://blog.cshttp://blog.csdn.net/mengxiangyue/article/category/1313478/2dn.http://blog. ...
- Hibernate的批量处理和分页技术、投影技术
投影查询——过滤部分字段返回的List集合元素为Object[] Query query = session.createQuery("select c.cname, c.csex from ...
- Python全栈day10(基础知识练习题)
一,执行python的两种方式 1,写在脚本里面调用python执行,例如python test.py 2, 输入python在命令行交互执行,例如 python >>> pri ...
- iOS 常用框架介绍
iOS框架介绍 Cocoa Touch GameKit 实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息 iOS设备之间蓝牙数据传输 从iOS7开始过期 局域网游 ...
- UISearchBar 详解
UISearchBar 详解 最近用到搜索功能.于是,经过不断的研究,终于,有点懂了. 那就来总结一下吧,好记性不如烂笔头! 搜索,无疑可以使用UISearchBar控件! 那就先了解一下UISe ...
- Python量化常用函数
# -*- coding: utf-8 -*- # @Author: fangbei # @Date: 2017-08-26 # @Original: price_str = '30.14, 29.5 ...
- 【react表格组件】material-table 基本用法 & 组件override
教程: https://mbrn.github.io/material-table/#/ https://material-ui.com/api/table/ github: https://gith ...
- python常见模块之序列化(json与pickle以及shelve)
什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flatte ...