log4j与json解析和XML解析
log4j的组成
-
日志记录器(logger):控制日志的级别
设置级别
日志会分级别去打印:
级别(从高到低)
1.off
2.fatal
3.error
4.warn
5.info
6.debug
7.all
注意:对我们而言,建议使用error warn info debug -
输出端(Appender):控制日志输出的位置(控制台或者文件)
指定输出位置
1.控制台:ConsoleAppender
2.日志文件:FileAppender
3.每天一个日志文件:DailyRollingFileAppender
4.指定日志文件大小:RollingFileAppender
5.存储到任意位置:WriterAppender
6.存储到数据库中:JDBCAppender -
日志格式化(Layout):控制日志显示格式
指定日志格式
1.SimpleLayout 简单格式
2.HTMLLayout HTML格式
3.PatternLayout 自定义格式
log4j练习
package com.chang;
import java.io.IOException;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.HTMLLayout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.SimpleLayout;
public class Log4jTest {
public static void main(String[] args) {
/*log4j的组成
* 1.日志记录器(logger):控制日志的级别
* 2.输出端(Appender):控制日志输出的位置(控制台或者文件)
* 3.日志格式化(Layout):控制日志显示格式
*
*/
//1.创建日志记录器(一般为了方便区分查找,都以本类名为日志记录)
Logger logger=Logger.getLogger(Log4jTest.class);
//2.指定日志格式
SimpleLayout simpleLayout=new SimpleLayout();
HTMLLayout htmlLayout=new HTMLLayout();
//需要了解占位符的功能
PatternLayout patternLayout=new PatternLayout("%-4r[%t]%-5p%c%x-%m%n");
//3.指定输出位置
ConsoleAppender consoleAppender=new ConsoleAppender(simpleLayout);
//添加给日志记录器
logger.addAppender(consoleAppender);
//----------------------------------------------------
try {
FileAppender fileAppender=new FileAppender(htmlLayout,"log.html");
logger.addAppender(fileAppender);
} catch (IOException e) {
e.printStackTrace();
}
//---------------------------------
/*
* 日期格式
* '.' yyyy-MM:每月
* '.' yyyy-ww:每周
* '.' yyyy-MM-dd:每天
* '.' yyyy-MM-dd-a:半天
* '.' yyyy-MM-dd-HH:每小时
* '.' yyyy-MM-dd-HH-mm:每分钟
*
*/
try {
DailyRollingFileAppender dailyRollingFileAppender=new DailyRollingFileAppender(patternLayout, "log.txt", "'.' yyyy-MM");
logger.addAppender(dailyRollingFileAppender);
} catch (IOException e) {
e.printStackTrace();
}
//设置级别
logger.setLevel(Level.WARN);
logger.error("日志信息1");
logger.debug("日志信息2");
logger.warn("日志信息3");
logger.info("日志信息4");
}
}
做个练习
public class Log4jPro {
public static void main(String[] args) {
/*
* 通过配置文件使用lo4j
* 要求:
* 1.文件名为log4j.properties
* 2.文件要放在src目录下
*/
//加载配置文件
PropertyConfigurator.configure("./src/log4j.properties");
//加载记录器
Logger logger=Logger.getLogger(Log4jPro.class);//为那个类提供日志记录
logger.error("日志信息!!!");
}
}
文件名为log4j.properties
## 设置日志的级别 以及输出
log4j.rootLogger=DEBUG,A,B
## 新建输出端
log4j.appender.A= org.apache.log4j.ConsoleAppender
## 设置日志格式
log4j.appender.A.layout= org.apache.log4j.SimpleLayout
## 也可以自行设置日志的输出级别
log4j.appender.A.Threshold=ALL
##新建输出端
log4j.appender.B=org.apache.log4j.FileAppender
##设置日志文件
log4j.appender.B.file=myLog4j.txt
##设置日志格式
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=[%r][%-5p][%c][%d{yyyy-MM-dd HH:mm:ss}]%n%m%n
## 设置日志级别
log4j.appender.B.Threshold=ERROR
然后在工程中创建一个myLog4j.txt文件
在lib(lib是创建的文件夹)文件中还要导入jar
json解析
fastjson 阿里提供的一个解析json数据的开源框架
1.第一步 读取json文件
2.查看文件最外层的符号
{},键值对—使用JsonObject接收
[], 数组----使用JsonArray接收
Json文件的最外层只能是以上两种!
解析json内容练习
package com.pase;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONReader;
public class JsonParse {
public static void main(String[] args) {
//获取文件路径
String path="./src/com/pase/LOLHero.json";
//通过路径获取文件信息
File file=new File(path);
//创建文件阅读器
FileReader fileReader=null;
try {
fileReader=new FileReader(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//4.创建json阅读器
JSONReader jsonReader=new JSONReader(fileReader);
//5.读取文件中的数据
String content=jsonReader.readString();
System.out.println(content);
//6.将json字符串 解析成Java中便于操作的容器
JSONObject jsonObject=JSON.parseObject(content);
//7.获取其中的key 开始解析
//数据源
HashMap<String, ArrayList<Hero>> dataMap=new HashMap<>();
for (String key : jsonObject.keySet()) {
//1.通过key获取值
JSONArray jsonArray=jsonObject.getJSONArray(key);
//2.创建ArrayList 将json格式存储成Java格式
ArrayList<Hero> heroArray=new ArrayList<>();
//遍历数组 获取每一条数据 并且封装成hero对象
for (Object o : jsonArray) {
JSONObject object=(JSONObject)o;
String name=object.getString("name");
String nickname = object.getString("nickname");
String tags = object.getString("tags");
String info = object.getString("info");
Hero h = new Hero(name, nickname, tags, info);
heroArray.add(h);
}
//内层循环 负责封装hero 并且存入数组
dataMap.put(key, heroArray);
}
for (String key : dataMap.keySet()) {
System.out.println(key);
for (Hero hero : dataMap.get(key)) {
System.out.println(hero);
}
}
}
}
创建Hero模型
//数据模型
public class Hero {
private String name;
private String nikname;
private String tags;
private String info;
public Hero() {
}
public Hero(String name, String nikname, String tags, String info) {
super();
this.name = name;
this.nikname = nikname;
this.tags = tags;
this.info = info;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNikname() {
return nikname;
}
public void setNikname(String nikname) {
this.nikname = nikname;
}
public String getTags() {
return tags;
}
public void setTags(String tags) {
this.tags = tags;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
return "Hero [name=" + name + ", nikname=" + nikname + ", tags=" + tags + ", info=" + info + "]";
}
}
LOLHero.json中的内容如下:
{
"ADC":
[
{"name":"戏命师", "nickname":"烬", "tags":"物理, 远程", "info":"作为一名心思缜密的癫狂杀手,烬坚信谋杀是一门艺术。他曾在艾欧尼亚的监狱中服刑,但却因为执政议会里涌动着的暗流而得到释放,成为了权术斗争所利用的刺客."},
{"name":"暴走萝莉", "nickname":"金克斯", "tags":"刷钱,远程", "info":"金克丝活着就是为了不计后果的四处肆虐,在她身后留下的只有一片混乱与恐慌。她是一名暴躁而残忍的罪犯,她蔑视一切仅仅是因为无聊,她会在她认为最无趣的地方:皮尔特沃夫。"},
{"name":"圣枪游侠", "nickname":"卢锡安~奥巴马", "tags":"刷钱,远程", "info":"卢锡安使用的是拥有传承力量的神圣武器,并成为对付不死族群的卫士。 他冷静而强大,面对无尽的恐怖时仍然可以惩罚对手通过其拥有的驱除之火。"},
{"name":"惩戒之箭", "nickname":"韦鲁斯", "tags":"远程,输出,控制", "info":"为了镇压一个远古的腐败深渊而建的一间寺院。这个深渊是那么地令人不安。韦鲁斯被一间神圣的艾欧尼亚寺院选作守望者。"},
{"name":"皮城女警", "nickname":"女警", "tags":"刷钱,远程,新手,后期,物理", "info":"皮特沃夫(皮城)被认为'进步之城'的主要原因是其极低的犯罪率。罗马不是一天建成的,皮特沃夫的低犯罪率也不是一来就有的。最初,皮特沃夫为了发展高科技,进口了很多珍贵资源,强盗和小偷们发现这块肥肉后便经常光顾这里。传说中的皮城女警凯特琳就此诞生..."},
{"name":"暗夜猎手", "nickname":"薇恩", "tags":"物理, 远程, 隐身", "info":"这个世界并不总像人们想象的那么美好。符文大陆上依旧有许多人通过最黑暗的方式修习魔法,被那些暗流涌动的黑暗力量腐蚀。夏娜-薇恩深知这一点。"},
{"name":"寒冰射手", "nickname":"艾希", "tags":"刺客, 眩晕, 减速, 打钱, 后期, 远程", "info":"弗雷尔卓德美女艾希是英雄联盟召唤师长期以来的最爱之一。作为阿瓦罗萨的直系后代,艾希是传奇三姐妹之一。她们各自宣称统治着居住在瓦洛兰大陆北部冻苔原地带的散乱部落。艾希继承了祖先精通的箭术,因此也继承了阿瓦罗萨“寒冰射手”的称号"}
],
"Magic":
[
{"name":"诡术妖姬", "nickname":"乐芙兰", "tags":"控制,沉默,法师,突进", "info":"每个城市都有你所不知的一面,正如每个人也都有着不为他人所知的一面。诺克萨斯,就是这么一个让人又爱又恨的地方..."},
{"name":"时间刺客", "nickname":"艾克", "tags":" 法师, 刺客", "info":"Ekko足智多谋,多年来混迹于祖安街头。他能一眼看穿敌人的弱点,攻破敌人的防线。他善于从过去的经历中吸取教训,是个完美主义者;为了能充分利用每分每秒,不惜牺牲自己的肉体。"},
{"name":"疾风剑豪", "nickname":"亚索", "tags":"近战,突进,打野,刺客", "info":"我的逃亡之旅到底还需要持续多久?即使是最强之风,终有一天也会在瓦罗兰大陆中逝去-亚索"},
{"name":"影流之主", "nickname":"劫", "tags":"近战,突进,打野,刺客", "info":"均衡只是一个骗局,我们才是真正的忍者!影流之主-劫"},
{"name":"暗黑元首", "nickname":"辛德拉", "tags":"法师,打钱", "info":"能量属于那些能够运用它的人!-辛德拉"},
{"name":"皎月女神", "nickname":"黛安娜", "tags":"近战,打钱,突进", "info":"黛安娜投身于战斗的热浪中,挥舞着她月牙枪刃,无情地施放着她的月光能量。"},
{"name":"机械先驱", "nickname":"维克托", "tags":"法师,控制,远程", "info":"在年轻时,维克托就发现了他对科学与发明的激情,特别是机械自动化这一领域。他参加了祖安享有盛名的科技魔法大学,并带领了一支队伍,研发出了布里兹这一科学史上的突破。"},
{"name":"潮汐海灵", "nickname":"小鱼人", "tags":"近战,法师", "info":"菲兹在大海中流浪数年去寻找他的人民,用他在冒险中学来的本领生存。最终,菲兹到达了比尔吉沃特港口。"},
],
"Soldier":
[
{"name":"海兽祭司", "nickname":"俄洛伊", "tags":"坦克, 近程", "info":"俄洛伊的体格强横无比,却唯独会在她的坚定信仰面前屈身。作为大海兽的先知,她挥舞着一个巨大的金色神像,将敌人的灵魂抽离体外,将他们对现实的感知完全击毁。"},
{"name":"皮城执法官", "nickname":"蔚", "tags":"近战,突进,打野", "info":"真遗憾。我有两只拳头,但你的脸上只放得下一只。-蔚"},
{"name":"未来守护者", "nickname":"杰斯", "tags":"刷钱,远程,近战 ", "info":"武装着睿智与魅力,以及标志性的可变形铁锤,杰斯毕生致力于守护他的祖国,皮尔特沃夫"},
{"name":"诺克萨斯之手", "nickname":"诺手", "tags":"近战,输出", "info":"团结一致的诺克萨斯能够掌控整个世界!而且理应如此!"},
{"name":"无双剑姬", "nickname":"菲奥娜-剑姬", "tags":"突进,打野,物理", "info":"想和我共舞一曲死亡的华尔兹么?-菲奥娜"},
{"name":"放逐之刃", "nickname":"锐雯", "tags":"刺客,近战", "info":"万剑重铸之日,骑士归来之时!前车之鉴,后车之师!"},
{"name":"孙悟空", "nickname":"猴子", "tags":"坦克, 战士", "info":"往全知的第一步是发现自己的无知。——易大师的第一课"},
{"name":"刀锋意志", "nickname":"刀妹", "tags":"刺杀,爆发,后期,近战", "info":"当绝望的艾欧尼亚人在普雷希典巨台准备投降时,艾瑞莉娅却高举起先父的传世之剑,誓死保卫家园直到兄长带领援兵归来..."},
{"name":"荒漠屠夫", "nickname":"鳄鱼", "tags":"推进,刷钱,物理", "info":"雷克顿来自遥远一个的世界,和哥哥内瑟斯一样都是兽形种族的一份子,统治且保护着人类。雷克顿和内瑟斯一起管理秘藏着远古智慧和生死循环奥义的大图书馆..."}
],
"Assist":
[
{"name":"河流之主", "nickname":"塔姆~舔舔", "tags":"坦克, 辅助", "info":"塔姆肯奇是一个既可以出现在单人路也可以担任坦克辅助的结实角色,什么东西他都能吃下。当敌人在他面前时,叠满被动后他会心满意足的将其吞噬到自己的大肚子里。"},
{"name":"魂锁典狱长", "nickname":"锤石", "tags":"远程,辅助,坦克", "info":"魂锁典狱长的过去鲜为人知,并且大多数细节只存在于童谣和传闻中。它们讲述着一个丧心病狂的狱卒的故事。"},
{"name":"唤潮鲛姬", "nickname":"娜美-美人鱼", "tags":"远程,辅助,法师", "info":"我即是狂澜,且无法被力挽。-唤潮鲛姬·娜美"},
{"name":"仙灵女巫", "nickname":"璐璐", "tags":"辅助,法系,控制", "info":"璐璐率性而为的程度,也许联盟中没有哪个英雄能够比得上。在班德尔城中度过的青春岁月中,她总是把大部分时间都花在林间漫步或者做白日梦上."},
{"name":"深海泰坦", "nickname":"泰坦", "tags":"打野, 控制, 近战", "info":"诺提勒斯苏醒时,他变得有些不太一样了。庞大的铁质潜水服已经变成了一个浑然一体的甲壳."},
{"name":"琴瑟仙女", "nickname":"琴女", "tags":"推线,辅助,治疗,刷钱,远程", "info":"当娑娜尚在襁褓之时,她便被抛弃在艾欧尼亚的一家孤儿院的门前。因而她对自己的亲生父母毫无记忆..."},
{"name":"天启者", "nickname":"卡尔玛", "tags":"辅助,远程,法师", "info":"卡尔玛所的沉着冷静使她成为了村庄各种矛盾的调停者。她的导师总说:'彼能起风,亦能止风...' "}
],
"Jungle":
[
{"name":"虚空遁地者", "nickname":"雷克赛~挖掘机", "tags":"战士, 打野, 肉盾", "info":"雷克赛是她族群之中体型最大、脾气最暴的。一旦雷克赛侦测到你,你的命运就已注定。毫无逃生的希望,她是来自沙砾之下的死亡。"},
{"name":"傲之追猎者", "nickname":"狮子狗", "tags":"近战,打钱,突进", "info":"单手宰羊,不如双手屠狼。——雷恩加尔。"},
{"name":"龙血武姬", "nickname":"龙女", "tags":"刺客,近战", "info":"以父之名,赐你死亡!"},
{"name":"法外狂徒", "nickname":"男枪", "tags":"刷钱 远程", "info":"格雷福斯出生在比尔吉沃特酒馆的后院,和一瓶混了酒精的牛奶一起被遗弃。残酷的现实迫使他在众多城市的地下社会勉强度日。"},
{"name":"盲僧", "nickname":"盲僧-李青", "tags":"刺客,近战", "info":"年轻的李青立志要成为一名召唤师,他的决心和奉献精神是同龄人无可比拟的。李青的才华引起了当时的联盟高级议员——瑞吉纳德-阿什拉姆的注意..."},
{"name":"雪人骑士", "nickname":"努努", "tags":"肉盾, 法师, 减速, 加速, 辅助, 打钱, 近战", "info":"瓦罗然极东之地被刺骨寒冰所覆盖,在漫长的冬季里,当地居民玩一个奇怪的游戏。他们弄醒一窝冬眠的雪人,然后挨个跳到雪人背上,比赛谁能骑乘..."},
{"name":"殇之木乃伊", "nickname":"阿木木", "tags":" 肉盾, 法师, 控场, 眩晕, 近战, 爆发", "info":"阿木木是英雄联盟世界里最古老的保卫者英雄之一,但他对加入联盟前的生活仍一无所知。阿木木唯一记得的是自己在恕瑞玛沙漠的一座金字塔内醒来。"}
]
}
控制台输出的json解析结果
XML解析
dom4j 谷歌提供的用于解析xml数据的开源框架
特点:会将xml数据整体读入内存中!并且读成树状结构!
我们只需要按照结构一层一层获取数据即可
解析XML文件中的数据
代码如下
package com.pase;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XMLParse {
public static void main(String[] args) {
//1.获取xml文件路径
String path="./src/com/pase/LOL.xml";
//2.创建阅读器
SAXReader saxReader=new SAXReader();
//3.读取xml文件 生成dom文档对象
Document document=null;
try {
document=saxReader.read(path);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//4.获取根节点
Element rootElement=document.getRootElement();
//5.获取根节点的子节点
List<Element> typeElements= rootElement.elements("type");
System.out.println(typeElements);
//6.获取heros子节点
List<Element> herosElements=rootElement.elements("heros");
System.out.println(herosElements);
//定义变量
int index=0;
//创建数据源
HashMap<String, ArrayList<Hero>> dataMap=new HashMap<>();
//Hero
for (Element heros : herosElements) {
List<Element> heroElements=heros.elements();
ArrayList<Hero> heroArray=new ArrayList<>();
for (Element hero : heroElements) {
//该取值了
String name=hero.element("name").getText();
String nikname=hero.element("nickname").getText();
String tags = hero.element("tags").getText();
String info = hero.element("info").getText();
Hero h=new Hero(name, nikname, tags, info);
heroArray.add(h);
}
String key=typeElements.get(index).getText();
dataMap.put(key, heroArray);
index++;
}
for (String key : dataMap.keySet()) {
for (Hero h : dataMap.get(key)) {
System.out.println(h);
}
}
}
}
LOL.xml中的内容
<?xml version="1.0" encoding="UTF-8" ?>
<Heroes>
<type>ADC</type>
<heros>
<hero>
<name>戏命师</name>
<nickname>烬</nickname>
<tags>物理, 远程</tags>
<info>作为一名心思缜密的癫狂杀手,烬坚信谋杀是一门艺术。他曾在艾欧尼亚的监狱中服刑,但却因为执政议会里涌动着的暗流而得到释放,成为了权术斗争所利用的刺客.</info>
</hero>
<hero>
<name>暴走萝莉"</name>
<nickname>金克斯</nickname>
<tags>刷钱, 远程</tags>
<info>金克丝活着就是为了不计后果的四处肆虐,在她身后留下的只有一片混乱与恐慌。她是一名暴躁而残忍的罪犯,她蔑视一切仅仅是因为无聊,她会在她认为最无趣的地方:皮尔特沃夫。</info>
</hero>
<hero>
<name>暗夜猎手</name>
<nickname>薇恩</nickname>
<tags>物理, 远程, 隐身</tags>
<info>这个世界并不总像人们想象的那么美好。符文大陆上依旧有许多人通过最黑暗的方式修习魔法,被那些暗流涌动的黑暗力量腐蚀。夏娜-薇恩深知这一点。</info>
</hero>
</heros>
<type>Magic</type>
<heros>
<hero>
<name>诡术妖姬</name>
<nickname>乐芙兰</nickname>
<tags>控制, 沉默, 法师, 突进</tags>
<info>每个城市都有你所不知的一面,正如每个人也都有着不为他人所知的一面。诺克萨斯,就是这么一个让人又爱又恨的地方...</info>
</hero>
</heros>
</Heroes>
没有上面说的json或XML文件自建一个直接复制里面的数据练习练习