码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-04-25 00:37:21      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:

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周学习总结

标签:

原文地址:http://www.cnblogs.com/sjy519/p/5427483.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!