zoukankan      html  css  js  c++  java
  • 20145308刘昊阳 《Java程序设计》第8周学习总结

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

    教材学习内容总结

    第15章 通用API

    15.1 日志

    15.1.1 日志API简介
    • java.util.loggging包提供了日志功能相关类与接口
    • 使用日志的起点是Logger类,Logger类的构造函数表示为protected,不是java.util.logging同包的类不能直接以new创建,取得Logger实例,必须用Logger的静态方法getLogger()
    • 调用getLogger()时必须指定Logger实例所属空间名称,以 . 区分层级,名称空间层级相同的Logger,其父Logger组态相同
    • 类之后接.class,可取得该类的java.lang.class实例,调用其getName()就可以取得类全名
    • 取得Logger实例之后,可以使用Log()方法输出信息,输出信息时可以使用Level的静态成员指定信息层级
    • 要输出的信息,必须先通过Logger的Level与Filter过滤,再通过Handler的Level和Filter过滤,格式化信息的动作交给Formatter
    15.1.2 制定日记层级
    • Level如果没做任何修改,取得的Logger实例之父Logger组态,Level默认是Logger.GLOBAL_LOGGER_NAME(INFO)名称空间Logger实例的组态,Handler默认是ConsoleHandler
    • Logger实例的getParent()取得父Logger实例,getlevel()取得设定的Level实例
    • Logger实例的层级必须大于或等于父Logger的Level
    • 可通过Logger的setLevel()设定层级,可用Level内建几个静态成员来指定
    • 使用intVlue()取得内含int值
    • log()时指定的Level实例内含的int值小于Logger设定的Level实例内含的int值,Logger就不会记录信息
    • Level.OFF用于关闭所有信息输出,Level.ALL用于允许所有信息输出
    • 一个Logger可以有多个Handler,通过addHandler()removeHandler()新增、移除Handler实例
    • getHandlers()方法来取得目前已有的Handler实例数组
    • Handler可以通过setLevel()设定信息
    • 一些日志层级,Logger有其对应的简便方法
    15.1.3 使用Handler与Formatter
    • MemoryHandler(信息存在缓冲区,超出缓冲区大小)、StreamHandler(可自动指定OutputStream实例)、ConsoleHandler(日志信息会显示在控制台上)、FileHandler(建立日志输出时使用的FileOutputStream)、SocketHandler(联网,将日志信息传至指定主机)
    • addHandler()removeHandler()新增、移除Handler
    • 建立FileHandler指定模式字符串,“%h”表示用户根目录,“%t”取得系统暂存目录,“%g”自动为文档编号
    • Logger的Config()是个简便方法,可以直接Level.CONFIG层级输出信息,也有severe()info()等简便方法
    • 调用Logger实例的setUseParentHandlers()设定为false,日志不会传播给父Logger,使用setParent()方法指定父Logger
    15.1.4 自定义Handler、Formatter与Filter
    • java.util.logging包中提供的Handler成果都不符合需求,继承Handler类,操作抽象方法publish()flush()close()方法来定义Handler,操作时考虑信息过滤与格式化
    • 自定义Formatter,继承Formatter后操作抽象方法format(),传入LogRecord,储存所有日志信息
    15.1.5 使用logging.properties
    • 通过logging.properties来设定Logger组态,修改.properties后另存至程序CLASSPATH中,指定java.util.logging.cofig.file系统属性为.properties名称

    15.2 国际化基础

    15.2.1 使用ResourceBundle
    • 使用ResourceBundle做信息绑定,准备.properties文档并放在CLASSPATH的路径设定下,文件中撰写键/值配对
    • ResourceBundle的静态getBundle()方法会取得一个ResourceBundle实例,给定自变量名称是信息文档的主文件名,取得实例后用getString()指定键取得文档中对应值
    15.1.2 使用Locale
    • 国际化三个重要概念:地区(Locale)信息、资源包(Resource bundle)与基础名称(Base name)
    • 地区可由一个语言编码与可选的地区编码来指定
    • 地区信息对应类是Locale,建立Locale实例时,可指定语言编码与地区编码
    • 资源包中包括了特定地区的相关信息
    • 将Unicode编码表示的.properties转回中文,使用-reverse自变量

    15.3 规则表达式

    15.3.1 规则表达式简介
    • String的spilt()方法,返回切割后各子字符串组成的String数组
    • 规则表达式基本包括两种字符:字面意义字符与元字符
    • 1.字面意义字符
      • 字母或数字:比较字母或数字
      • :比较
    • 2.字符类
      • 任一个字符切割:[]
      • 连字符—:表示从...到...
      • 反字符^:表示除...以外的字符
      • 预定义字符
    • 3.贪婪、逐步、独吐量词
      • 贪婪量词:{n}是贪婪量词表示法的一种,贪婪量词会尽可能的找到长度最长的符合文字
      • 逐步量词:在贪婪量词表示法后加上?,会成为逐步量词(懒惰量词,非贪婪量词),会找到长度最短的符合文字
      • 独吐量词:在贪婪量词表示法后加上+,会成为独吐量词,将剩余文字吃掉,然后看看独吞量词部分是否符合吃下的文字,如果符合就不会再吐出来了
      • replaceAll()会将符合规则表达式的字符串取代后返回新字符串
    • 4.边界比较
      • 边界比较用来表示文字必须符合指定的边界条件(定位点)
    • 5.分组与参考
      • 使用()将规则表达式分组,被分组的规则表达式可以在稍后回头参考
    15.3.2 Pattern与Matcher
    • java.util.Regex.Pattern实例是规则表达式在JVM中的代表对象,Pattern的构造函数被标示为private,无法用new创建Pattern实例,必须通过Pattern的静态方法compile()来取得
    • 取得Pattern实例后,可以使用mather()方法将指定字符串依规则表达式切割
    • 使用matcher()方法指定要比较的字符串,find()方法看是不是有下一个符合字符串,lookingAt()看字符串开头是否符合规则表达式,group()方法返回符合的字符串
    • 规则表达式中有分组,group()可以接受int整数指定分数计数(1-...),group(0)相当于group()
    • replaceAll()方法,将符合规则表达式的部分以指定的字符串替代,replaceFirst()replaceEnd()分别可取代首个、最后反符合规则表达式部分,start()方法可取得符合字符串的起始索引,end()取得符合字符串最后一个字符后的索引

    15.4 JDK8 API增强功能

    15.4.1 StringJoiner、Arrays新增API
    • 1.String.join()、StringJoiner
      • String上有join()静态方法可以指定每个字符串间以什么间隔
      • Collectors上有joining()静态方法
    • 2.Arrays
      • paralleSort()方法可以将指定的数组分为子数组并以平行化方式分别排序,然后再进行合并排序
    15.4.2 Stream相关API
    • 对数组进行管线化操作
      • 使用ArraysasList()方法返回List,而后调用stream()方法取得stream实例
      • 使用Arraysstream()方法,可以指定数组后返回Stream实例

    代码托管截图

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

    • 问题:p471LoggerDemo为什么不会输出Level.CONFIG和Level.FINE的信息
    • 解决过程:结合P472图示与P473讲解,得知Logger的层级必须大于等于父Logger,才能将信息输出至控制台,Logger层级默认为INFO,Level.CONFIG和Level.FINE都小于INFO,所以不会输出

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

    本周代码调试没有问题

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

    学习了将系统运行记录到日志的方法,通过日志的层级关系,结合了继承的知识,更深的理解了父类和子类的关系,还学习了国际化标准和规则表达式

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 30/30 1/2 16/16 基本概念
    第二周 100/130 1/3 18/34 基础语法
    第三周 100/230 1/4 26/60 对象封装
    第四周 300/530 1/5 30/90 继承接口
    第五周 300/830 1/6 30/120 异常MapCollection
    第六周 300/1230 2/8 30/150 输入输出、并行
    第七周 100/1330 2/10 10/160 时间日期
    第八周 100/1430 2/12 15/175 通用API
  • 相关阅读:
    QR code
    复制一个带random指针的链表
    运行时const
    海量处理 bitmap及区段划分
    socket编程随记
    BLS签名
    load balancing
    Bloom Filter (2)
    #include 的花样
    拓扑排序、Dijkstra、Prim/Kruskal、全部最短路径/传递闭包
  • 原文地址:https://www.cnblogs.com/yg961022/p/5427642.html
Copyright © 2011-2022 走看看