一、日志

1. 日志API简介

public static void main(String[] args) throws IOException {
        Logger logger = Logger.getLogger(Main.class.getName());
        logger.setLevel(Level.FINE);
        for (Handler handler : logger.getParent().getHandlers()) {
            handler.setLevel(Level.FINE);
        }
        //日志信息要经过Logger和Handler的同时过滤,所以要同时设置Logger和Handler的level才能输出日志
        logger.log(Level.WARNING, "WARNING");
        logger.log(Level.INFO, "INFO");
        logger.log(Level.CONFIG, "CONFIG");
        logger.log(Level.FINE, "FINE");
    }

  • 如果客户端调用了logger的log方法,首先会根据Level过滤信息,在看看Logger有无设定Filter接口的实例,如果有且其isLoggable()返回true,才会调用Handler实例的publish()方法,Handler也可以设定自己的Filter实例,如果有且其isLoggable()返回true,就调用Formatter实例的format()方法格式化信息,最后才调用输出对象,将格式化后的信息输出。
  • 简单来说,Logger是记录信息的起点,要输出的信息必须先经过Logger的Level与Filter过滤,再通过Handler的Level与Filter过滤,格式化信息的动作交给Formatter,输出信息的动作实际上是Handler负责

2. 指定日志层级

		logger.setLevel(Level.FINE);
        for (Handler handler : logger.getParent().getHandlers()) {
            handler.setLevel(Level.FINE);
        }

3. 使用Handler与Formatter

public static void main(String[] args) throws IOException {
        Logger logger = Logger.getLogger(Main.class.getName());
        logger.setLevel(Level.CONFIG);
        //%h表示用户根目录 C:\Users\username
        //%t表示系统暂存目录 %g表示按照序号递增log文件
        Handler handler = new FileHandler("%h/config%g.log");
        handler.setLevel(Level.CONFIG);
        logger.addHandler(handler);
        logger.log(Level.WARNING, "WARNING");
        logger.log(Level.INFO, "INFO");
        logger.log(Level.CONFIG, "CONFIG");
        logger.log(Level.FINE, "FINE");
    }
  • FileHandler默认的Formatter是XMLFormatter,所以输出的文件为xml格式的

  • 可以通过handler的setFormatter()方法设定Formatter
  • 如果不想让父Logger的Handler处理日志,可以调用Logger实例的setUseParentHandler()为false
  • handler setEncoding()可以设置文字编码

4. 自定义Handler、Formatter、与Filter

package com.leo;

import java.util.logging.Handler;
import java.util.logging.LogRecord;

/** * @ClassName: CustomHandler * @Author: Leo * @Description: * @Date: 8/6/2019 2:55 PM */
public class CustomHandler extends Handler {
    @Override
    public void publish(LogRecord record) {
        if (isLoggable(record)) {
            return;
        }
        String longMsg = getFormatter().format(record);
        //输出到控制台 这里可以自定义目的地
        System.out.println(longMsg);
    }

    @Override
    public void flush() {
        //出清信息
    }

    @Override
    public void close() throws SecurityException {
        //关闭输出对象
    }
}

public static void main(String[] args) throws IOException {
        Logger logger = Logger.getLogger(Main.class.getName());
        logger.setLevel(Level.CONFIG);
        //%h表示用户根目录 C:\Users\username
        //%t表示系统暂存目录 %g表示按照序号递增log文件
        Handler handler = new FileHandler("%h/config%g.log");
        handler.setLevel(Level.CONFIG);
        logger.addHandler(handler);
        logger.log(Level.WARNING, "WARNING");
        logger.log(Level.INFO, "INFO");
        logger.log(Level.CONFIG, "CONFIG");
        logger.log(Level.FINE, "FINE");
        handler.setFormatter(new Formatter() {
            @Override
            public String format(LogRecord record) {
                return "日志来自:" + record.getSourceClassName();
            }
        });
    }

5. 使用logging.properties

  • 在jdk的conf文件夹中,有logging.properties示例文档:
############################################################
#  	Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.  
# For example java -Djava.util.logging.config.file=myfile
############################################################

############################################################
#  	Global properties
############################################################

# "handlers" specifies a comma separated list of log Handler 
# classes.  These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.
handlers= java.util.logging.ConsoleHandler

# To also add the FileHandler, use the following line instead.
#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers.  For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= INFO

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
# Default number of locks FileHandler can obtain synchronously.
# This specifies maximum number of attempts to obtain lock file by FileHandler
# implemented by incrementing the unique field %u as per FileHandler API documentation.
java.util.logging.FileHandler.maxLocks = 100
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# Example to customize the SimpleFormatter output format 
# to print one-line log message like this:
#     <level>: <log message> [<date/time>]
#
# java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n

############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
# com.xyz.foo.level = SEVERE

  • 修改此配置文件,然后放到项目的classpath中,通常为resources文件夹,然后在启动jvm的时候添加参数:
  • -Djava.util.logging.config.file=logging.properties

二、国际化

internationalization 简称i18n(因为i到n之间有18个字母)

地区(Locale)
资源包(Resource bundle)
基础名称(Base Name)

三、正则表达式

API:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/regex/Pattern.html

  1. 字面意义字符
字符 说明
\ 反斜杠字符
\0ñ 八进制值为0n (0 <= n <= 7)的字符
\0NN 八进制值0nn (0 <= n <= 7)的字符
\0MNN 八进制值的字符0MNN (0 <= 米 <= 3,0 <= Ñ <= 7)
\xHH 具有十六进制值的字符0xhh
\uHHHH 具有十六进制值的字符 0xhhhh
\x{H … H} 具有十六进制值0xh … h (Character.MIN_CODE_POINT <= 0xh … h <= Character.MAX_CODE_POINT)的字符
\N {名称} Unicode字符名称’name’的字符
\t 制表符(’\u0009’)
\n 换行符(换行符)(’\u000A’)
\r 回车符(’\u000D’)
\f 换页字符(’\u000C’)
\a 警报(铃)字符(’\u0007’)
\e 转义字符(’\u001B’)
\cX 对应于x的控制字符
  1. 字符类
字符类 说明
[abc] a, b或c(简单类)
[^abc] 任何字符除了a,b或c(否定)
[a-zA-Z] a通过z 或A通过Z,包容性(范围)
[a-d[m-p]] a通过d或m通过p:( [a-dm-p]联盟)
[a-z&&[def]] d,e,或f(交集)
[a-z&&[^bc]] a通过z,除了b和c:( [ad-z]减法)
[a-z&&[^m-p]] a通过z,而不是m通过p:( [a-lq-z]减法)
预定义字符 说明
. 任何字符(可能与行终止符匹配也可能不匹配)
\d 一个数字: [0-9]
\D 非数字: [^0-9]
\h 一个水平的空白字符: [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]
\H 非水平空白字符: [^\h]
\s 一个空白字符: [ \t\n\x0B\f\r]
\S 非空白字符: [^\s]
\v 垂直空白字符: [\n\x0B\f\r\x85\u2028\u2029]
\V 非垂直空白字符: [^\v]
\w 一个字符: [a-zA-Z_0-9]
\W 非单词字符: [^\w]

四、处理数字

BigInteger、BigDecimal