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的相关知识

参考资料

时间: 2024-08-26 19:39:47

20145216史婧瑶《Java程序设计》第8周学习总结的相关文章

20145216史婧瑶《信息安全系统设计基础》第十一周学习总结

20145216史婧瑶<信息安全系统设计基础>第十一周学习总结 教材内容总结 第八章 异常控制流 平滑:指在存储器中指令都是相邻的. 突变:出现不相邻,通常由诸如跳转.调用.和返回等指令造成. 异常控制流ECF:即这些突变. 关于ECF: 1.ECF是操作系统用来实现I/O.进程和虚拟存器的基本机制 2.应用程序通过使用一个叫做陷阱或者系统调用的ECF形式,向操作系统请求服务 3.ECF是计算机系统中实现并发的基本机制 4.软件异常机制--C++和Java有try,catch,和throw,C

20145216史婧瑶《信息安全系统设计基础》第3周学习总结

20145216史婧瑶<信息安全系统设计基础>第3周学习总结 教材学习内容总结 十六进制表示法C表示法以0x或0X开头的数字常量为十六进制进制转换常用进制:二进制(B),十进制(D),八进制(O或者Q),十六进制(H) 转换为二进制-十六进制相互转换,二进制的四位数字对应十六进制的一位数字. 同理,二进制与八进制的转化是三位对应一位. 但是通常情况下,进制转换都以二进制为桥梁进行转换. 对于一个字长为w位的机器来说,虚拟地址的范围是0~2^w-1.程序最多访问2的w次方个字节. 数据大小: 在

20145216史婧瑶《信息安全系统设计基础》第九周学习总结

20145216史婧瑶<信息安全系统设计基础>第九周学习总结 教材内容总结 第十章 系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 第一节 Unix I/O 这一节涉及到操作系统的基本抽象之一--文件.也就是说,所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写.相关的执行动作如下: 1.打开文件: 应用程序向内核发出请求→要求内核打开相应的文件→内核返回文件描述符 文件描述符:一个小的非负整数,用来在后续对此文件的所有操作中标识这个文件.有

20145216史婧瑶 《信息安全系统设计基础》第2周学习总结

20145216史婧瑶 <信息安全系统设计基础>第2周学习总结 教材学习内容总结 一.VIM 1.hjkl所表示的即为光标 ←↓↑→,前提是要在normal的状态下.方便记忆j像一个笔就像下箭头. ·i → Insert 模式,可插入文本.按 ESC 回到 Normal 模式. ·A → 输入欲添加文本(在一行后添加文本).按 ESC 回到 Normal 模式. ·x → 删当前光标所在的一个字符. ·:wq → 存盘 + 退出 (:w 存盘, :q 退出) 2.删除类命令: 该命令为操作符d

20145216史婧瑶《信息安全系统设计基础》第7周学习总结

20145216史婧瑶<信息安全系统设计基础>第七周学习总结 教材内容总结 第六章 存储器层次结构 存储器系统是一个具有不同容量.成本和访问时间的存储设备的层次结构. CPU寄存器.高速缓存存储器.主存储器.磁盘. 第一节 存储技术 一.随机访问存储器(RAM) 1.RAM分类: 静态的SRAM-更快,更贵,作为高速缓存存储器,CPU片上或片下 动态的DARM-作为主存以及图形系统的帧缓冲区 2.非易失性存储器--ROM (1)分类 PROM-可编程ROM,只能被编程一次 EPROM-可擦写可

20145216史婧瑶《信息安全系统设计基础》第6周学习总结

20145216史婧瑶<信息安全系统设计基础>第6周学习总结 教材内容总结 第四章 处理器体系结构 第一节 Y86指令集体系结构 一.程序员可见的状态 1.含义:每条指令都会读取或修改处理器状态的某些部分 2."程序员":可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器 3.具体的处理器状态:类似于IA32 有8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp 处理器的每个程序寄存器存储一个字 寄存器%esp被入栈.出栈

20145216史婧瑶《网络对抗》Web安全基础实践

20145216史婧瑶<网络对抗>Web安全基础实践 实验问题回答 (1)SQL注入攻击原理,如何防御 攻击原理: SQL注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是SQL语法里的一些组合,程序通过执行SQL语句进而执行攻击者所要的操作.其主要原因是程序没有细致的过滤用户输入的数据,致使非法数据侵入系统. 防御方法: 对输入的数据进行过滤,将常见的sql语句的关键词:select or ' " 等字符进行过滤. 对在数据库中对密码进行加密,验证登陆的时

20145216史婧瑶《网络对抗》网络欺诈技术防范

20145216史婧瑶<网络对抗>网络欺诈技术防范 实验问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 攻击者能对在同一网段可以ping通的电脑发起DNS spoof攻击,所以一般在连接公用Wi-Fi的情况下电脑容易受到DNS spoof攻击. (2)在日常生活工作中如何防范以上两种攻击方法 1.尽量避免连接公用Wi-Fi2.在访问网站时注意观察它的IP地址 实验总结与体会 这次实验我遇到了许多问题,第一个是我做简单应用SET工具建立冒名网站这个实验的时候,第一次克隆的是腾讯页

20145216史婧瑶《网络对抗》逆向及Bof进阶实践

20145216史婧瑶<网络对抗>逆向及Bof进阶实践 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. Linux中两种基本构造攻击buf的方法:retaddr+nop+shellcode ,nop+shellcode+retaddr ,缓冲区小就就把shellcode放后边,不然就放前边. 实验步骤 1.准备一段shellcode代码 2.设置环境 Bof攻击防御

20145216史婧瑶 《网络对抗》 MSF基础应用

20145216史婧瑶 <网络对抗> MSF基础应用 实验回答问题 用自己的话解释什么是exploit,payload,encode. exploit:渗透攻击模块,测试者利用它来攻击一个系统,程序,或服务,以获得开发者意料之外的结果. payload:攻击载荷模块,由一些可动态运行在远程主机上的代码组成 encode:编码器模块,对指令重新进行编码,用以实现反检测功能.指令顺利执行等 实践过程 主动攻击(ms08_067漏洞) MS08_067远程漏洞攻击实践:Shell 1.在VMware