20145330第八周《Java学习笔记》###

第十五章 通用API

通用API

  • 日志:日志对信息安全意义重大,审计、取证、入侵检验等都会用到日志信息
  • 日志API
    • Logger:注意无法使用构造方法生成Logger对象

      • Logger logger=Logger.getLogger("xxx");
      • getLevel
      • setLevel
      • 调用getLogger()时,必须指定Logger实例所属名称空间(Name Space),名称空间以"."作为层级区分,名称空间层级相同的Logger,其父Logger组态相同。
      • 通常在哪个类中取得的Logger,名称空间就会命名为哪个类全名,也会以以下方式取得Logger:
      • Logger logger=Logger.getLogger(Main.class.getName());
      • 取得logger实例之后,可以使用log()方法输出信息,输出信息时可以使用Level的静态成员指定信息层级,例如:

import java.util.logging.*; 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 訊息");
}
}

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

    • Level
    • Handler:输出介质
  • 指定日志层级
    • 在经过logger过滤后,还得经过Handler的过滤
    • 若要显示INFO以下的信息,不仅要将logger的层及设定为Level.INFO,也得将Handler的层及设定为Level.INFO,例如:

import java.util.logging.*; 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 讯息");
}
}

  • 使用Handler与Formatter

    • logger可以使用addHandler()新增Handler实例,使用removeHandler()移除Handler,下面范例将logger与新建的FileHandler层及设定,并使用addHandler()设定logger实例:

import java.io.IOException;
import java.util.logging.*; public class HandlerDemo { public static void main(String[] args) throws IOException {
Logger logger = Logger.getLogger(HandlerDemo.class.getName());
logger.setLevel(Level.CONFIG);
FileHandler handler = new FileHandler("%h/config.log");
handler.setLevel(Level.CONFIG);
logger.addHandler(handler);
logger.config("Logger 组态完成");
}
}
  • 自定义Handler、Formatter、Filter

    • 如果java.util.logging包中提供的Handler成果都不符合需求,可以继承Handler类,操作抽象方法publish()、flush()与close()方法来自定义Handler
    • 操作时要记得,在职责分配上,Handler是负责输出,格式化是交由Formatter,而信息过滤是交由Filter

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

    • 实际上,可以通过logging.properties来设定logging组态,这样就很方便。

国际化基础

  • 使用ResourceBundle

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

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") + "!");
}
}
  • 使用Locale

    • 国际化的三个重要概念是地区信息(Locale)、资源包与基础名称
    • 地区信息代表了特定的地理、政治或文化区,地区信息可由一个语言编码与可选的地区编码来指定。
    • 地区信息的对应类是Locale,在建立Locale实例时,可以指定语言编码与地区编码

规则表示式

  • 规则表示式简介

    • 如果你有个字符串,项根据某个字符或字符串切割,可以使用string与split()方法。例如:

import static java.lang.System.out; public class SplitDemo { public static void main(String[] args) { for(String token : "Justin,Monica,Irene".split(",")) {
out.println(token);
} for(String token : "JustinOrzMonicaOrzIrene".split("Orz")) {
out.println(token);
} for(String token : "Justin\tMonica\tIrene".split("\\t")) {
out.println(token);
}
}
}
  • 执行结果会分别针对逗号、Orz、Tab字符对字符串进行切割:

  • 字面意义字符

  • 字符类

  • 贪婪、逐步、独吐量词

  • 边界比较

  • 分组与参考

  • Pattern与Matcher

    • 在程序中使用规则表示式,必须先针对规则表示式做剖析,验证等动作,确定规则表式语法无错误,对字符串进行比较。
    • 使用group()方法可以返回符合的字符串,例如:

import static java.lang.System.out;
import java.util.regex.*; public class PatternMatcherDemo { public static void main(String[] args) {
String[] regexs = {".*foo", ".*?foo", ".*+foo"};
for(String regex : regexs) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("xfooxxxxxxfoo");
out.printf("%s find ", pattern.pattern());
while(matcher.find()) {
out.printf(" \"%s\"", matcher.group());
}
out.println(" in \"xfooxxxxxxfoo\".");
}
}
}


import static java.lang.System.out;
import java.util.*;
import java.util.regex.*; public class Regex { public static void main(String[] args) {
Scanner console = new Scanner(System.in);
try {
out.print("输入规则表示式:");
String regex = console.nextLine();
out.print("输入要比较的文字:");
String text = console.nextLine();
print(match(regex, text));
} catch(PatternSyntaxException ex) {
out.println("规则表示式有误");
out.println(ex.getMessage());
}
} private static List<String> match(String regex, String text) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
List<String> matched = new ArrayList<>();
while(matcher.find()) {
matched.add(String.format(
"从索引 %d 开始到索引 %d 之间找到符合文字 \"%s\"%n",
matcher.start(), matcher.end(), matcher.group()));
}
return matched;
} private static void print(List<String> matched) {
if(matched.isEmpty()){
out.println("找不到符合文字");
}
else {
matched.forEach(out::println);
}
}
}

JDK8 API增强功能

  • String新增join()静态方法可以指定每个字符串间以逗号分隔进行连接。
  • Arrays上新增parallelPrefix()、parallelSetAll()与parallelSort()方法,parallelSort()方法,可以将指定的数组分为子数组并以平行化方式分别排序,然后再进行合并排序。

学习中的问题和解决方法

  • 在时间计算中,时区的计算是非常困难的,在新的时间与日期API中个,UTC偏移量与时区的概念是分开的,OffsetDateTime单纯代表UTC偏移量,使用ISO 8601,如果有LocalDateTIme、LocalDate、Localtime
  • 也可以在分别补齐必要信息后,取得UTC偏移量。
  • 在运行DateFormatDemo中,提示它是公共的,应该在该文件的.java中声明,代码中定义的本来就为public class,DateFormatDemo。之后去除public之后就能成功运行了。

学习感受

这周的任务相对之前轻松一些,所以也有更多的时间将知识梳理与弄明白。而且还有时间去复习其他科的知识,让我感到十分充实。希望可以一直保持状态,进入良好的学习循环中。需要我们学会使用日志API、了解国际化基础、认识JDK8增强功能等。通过前面几周的学习,java的核心知识与难点之前都已经学完了,后面的章节大概都是介绍一些类的应用。在以后的学习中,将会把重点放在实验博客的撰写上面,感觉实验才是检验学习的真正方法和途径。

代码托管截图



学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90
第五周 200/1500 1/10 20/20
第六周 200/1700 2/12 18/108
第七周 200/1900 2/14 20/128
第八周 200/2100 2/16 20/148

20145330第八周《Java学习笔记》的更多相关文章

  1. 第八周java学习总结

    学号 20175206 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章:泛型与集合框架 主要内容 泛型 链表 堆栈 散列映射 树集 树映射 重点和难点 重点:泛型和集合的使 ...

  2. 20145231第二周Java学习笔记

    20145231 <Java程序设计>第2周学习总结 教材学习内容总结 本周的学习采用的依然是先看课本,再看视频,然后实践敲代码,最后根据学习笔记总结完成博客. 第三章:基础语法 知识点比 ...

  3. 20165223《Java程序设计》第八周Java学习总结

    教材学习内容总结 第12章-JAVA多线程机制 要点 Java中的线程 Thread类与线程的创建 线程的常用方法 线程同步 协调同步的线程 线程联合 GUI线程 计时器线程 教材学习中的问题和解决过 ...

  4. 2017-04-21周Java学习笔记

    2017-04-21-周Java学习笔记... -------------------------------------- 计算机起源于:战争中的炮弹轨道计算.Unix操作系统是使用C语言编写的操作 ...

  5. 2019年8月19日~8月25日 第八周JAVA学习总结

    临近开学,本周的任务完成情况不够好,平常乱七八糟的事情比较多,所以放在学习上的心思比较少.平均每天放在JAVA学习的时间约1个小时,放在编程的时间约半小时,解决问题的时间约1小时. 下一个星期就要开学 ...

  6. 20145307第八周JAVA学习报告

    20145307<Java程序设计>第8周学习总结 教材学习内容总结 通用API 日志API 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是logge ...

  7. 第八周LINUX学习笔记

    vsftpd丶NFS丶SAMBA nfs基于rpcsamba基于cifs(smb)  DRBD: ftp:File Transfer protocol 文件传输协议 两个连接:       tcp:命 ...

  8. 《第六周java学习笔记》

    教材知识点总结 Java 把 String 类定义为 final 类. new 运算符首先分配内存空间并在内存空间中放入字符序列,然后计算出引用.(new String(char a[],int st ...

  9. 20165319第五周java学习笔记

    教材内容总结 1.String类和StringBuffer类都覆盖了toString方法,都是返回字符串. 所以带不带toString效果是一样的. 2.instanceOf运算符可以用来判断某个对象 ...

随机推荐

  1. PHP面向对象编程之深入理解方法重载与方法覆盖(多态)

    这篇文章主要介绍了PHP面向对象编程之深入理解方法重载与方法覆盖(多态)的相关资料,需要的朋友可以参考下: 什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态" ...

  2. 使用nbrbutil工具來處理requested media id is in use, cannot process request

    首先我發現一個Media已經過期很久,但是并不會覆蓋重用 使用bpexpdate手動過期,失敗,讓他deassigned也不行 使用bpimmedia查看上面的image也沒有 我嘗試手動去過期,返回 ...

  3. Thinkphp 解决写入配置文件的方法

    在/Application/Common/Common创建function.php,然后添加以下代码: <?php /** * [writeArr 写入配置文件方法] * @param [typ ...

  4. hdu 5833 Zhu and 772002 高斯消元

    Zhu and 772002 Problem Description Zhu and 772002 are both good at math. One day, Zhu wants to test ...

  5. HDU 3364 Lanterns 高斯消元

    Lanterns Problem Description   Alice has received a beautiful present from Bob. The present contains ...

  6. UVA232字符串处理

    #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> ...

  7. 循环冗余检验算法CRC

    http://blog.csdn.net/liyuanbhu/article/details/7882789 首先要了解多项式乘法,除法 了解模2运算的含义,多项式除法后合并同类项时..系数%2处理 ...

  8. pythonpython-eggs异常解决方法

    : UserWarning: /home/server/.python-eggs is writable by group/others and vulnerable to attack when u ...

  9. LoadRunner下载文件脚本

    LoadRunner下载文件脚本  在看普泽关于pezybase的测试报告的时候,发现里面有用到jmeter(http协议)并发测试下载文件,考虑到后面可能需要在公司pezybase的并发下载,把之前 ...

  10. LoadRunner 常用C语言函数使用

    strlen:获取字符串的长度 char str[20]="容我想想"; int len; len = strlen(str); lr_output_message("s ...