/**利用缓存机制快速读取XML文件中的数据
*如果频繁解析文件,速度肯定受到影响,在文件非常大的情况下,甚至是无法忍受的。如果在服务器启动的时候先把文件中的数据封装成对象数组读入到缓存中,每次访问的时候先判断一下要访问的文件实体有没有被更新,如果没有被更新,就直接从缓存中将想要的数据读出来,当然如果文件被更新了,那只好老老实实的解析文件读出想要的数据。管理者对文件的修改次数毕竟是少数,更多的是访问者的访问次数。这样就能很大的提高了访问速度,代价是要占用一定的内存空间,但相比之下应该算小巫吧。
*下面把简单实现的几个Class说一说。
*一 首先实现一个Cache类,里面有读取对象的方法get(),如果文件没有被修改则直接从HashMap里面将对象取出,如果文件被修改则调用readObject()方法实现从文件中读出数据,并同时将读出的数据放入HashMap里,将原来的对象覆盖。这样下次再读数据的时候就可以从缓存中直接读到,并且保证是最新的数据。还有一个判断文件是否被修改的方法getModified();
*/
//代码实现如下:
import java.io.File;
import java.util.HashMap;
public class Cache {
HashMap mapLastModified = new HashMap();
HashMap mapValues = new HashMap();
public Cache() {
super();
}
public Object get(String name, String path, Class clsParser, Class clsInstantiator, Class clsObj) {
Object obj = null;
String absPath = getClass().getResource(path).getPath();
Long modified = getModified(name, absPath);
if (modified != null) {
obj = readObject(absPath, clsParser, clsInstantiator, clsObj);
mapLastModified.put(name, modified);
mapValues.put(name, obj);
System.out.println("get object from file");
} else {
obj = mapValues.get(name);
System.out.println("get object from cache");
}
return obj;
}
private Long getModified(String name, String path) {
Long modified = new Long(new File(path).lastModified());
Long saveModified = (Long) mapLastModified.get(name);
if ((saveModified != null) && (saveModified.longValue() >= modified.longValue())) {
modified = null;
}
return modified;
}
private Object readObject(String path, Class clsParser, Class clsInstantiator, Class clsObj) {
try {
FileParser parser = (FileParser) clsParser.newInstance();
Instantiator instantiator = (Instantiator) clsInstantiator.newInstance();
Object config = parser.parse(path);
return instantiator.instantiate(clsObj, config);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
/**二 解析XML文件的类XmlFileParser,
*为了方便处理不同文件的解析,在这里先定义一个接口FileParser,XmlFileParser实现了它,如果还有诸如对其他种类文件的解析也可以实现它。
*/
//FileParser.java
public interface FileParser {
Object parse(String path);
}
//XmlFileParser.java
//采用Jdom的解析方式
import java.io.FileInputStream;
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
public class XmlFileParser implements FileParser {
public XmlFileParser() {
super();
}
public Object parse(String path) {
FileInputStream fi = null;
try {
fi = new FileInputStream(path);
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(fi);
Element root = doc.getRootElement();
return root.getChildren();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fi.close();
} catch (IOException e1) {
}
}
}
}
/**三 接下来是一个实例化处理的类ListTypeInstantiator,同样为了方便处理不同文件的实例化,在这里先定义一个接口Instantiator,ListTypeInstantiator实现了它。
*/
//Instantiator.java
public interface Instantiator {
Object instantiate(Class clazz, Object configuration);
}
//ListTypeInstantiator.java
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.jdom.Element;
public class ListTypeInstantiator implements Instantiator {
public ListTypeInstantiator() {
super();
}
public Object instantiate(Class clazz, Object configuration) {
List arr = new ArrayList();
Object bean = null;
List children = (List) configuration;
Element child = null;
List attributes = null;
Element attribute = null;
try {
for(int i=0; i child = (Element) children.get(i);
bean = clazz.newInstance();
attributes = child.getChildren();
for(int j=0; j attribute = (Element) attributes.get(j);
BeanUtils.setProperty(bean, attribute.getName(), attribute.getText());
}
arr.add(bean);
}
} catch(Exception e) {
e.printStackTrace();
}
return arr;
}
}
//四 另外还需要一个封装我想要数据形式的JavaBean,这里设为NewsBean{}.
//NewsBean.java
public class NewsBean {
private Long id;
private String newsTitle;
private String newsContent;
private String newsType;
private String deployDate;
private String cancelDate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNewsTitle() {
return newsTitle;
}
public void setNewsTitle(String newsTitle) {
this.newsTitle = newsTitle;
}
public String getNewsContent() {
return newsContent;
}
public void setNewsContent(String newsContent) {
this.newsContent = newsContent;
}
public String getNewsType() {
return newsType;
}
public void setNewsType(String newsType) {
this.newsType = newsType;
}
public String getDeployDate() {
return deployDate;
}
public void setDeployDate(String deployDate) {
this.deployDate = deployDate;
}
public String getCancelDate() {
return cancelDate;
}
public void setCancelDate(String cancelDate) {
this.cancelDate = cancelDate;
}
}
//五 最后一步测试结果,将news.xml文件放到classes目录下。
//MainClass.java
import java.util.List;
public class MainClass{
public static void main(String[] args) throws Exception {
List news1 = null;
List news2 = null;
NewsBean bean = null;
news1 = (List)Cache.get(
"news", "/news.xml",
XmlFileParser.class, ListTypeInstantiator.class, NewsBean.class);
for (int i = 0; i < news1.size(); i++) {
bean = (NewsBean) news1.get(i);
System.out.println(bean.getId());
System.out.println(bean.getNewsTitle());
System.out.println(bean.getNewsContent());
System.out.println(bean.getNewsType());
System.out.println(bean.getDeployDate());
System.out.println(bean.getCancelDate());
}
news2 = (List)Cache.get(
"news", "/news.xml",
XmlFileParser.class, ListTypeInstantiator.class, NewsBean.class);
for (int i = 0; i < news2.size(); i++) {
bean = (NewsBean) news2.get(i);
System.out.println(bean.getId());
System.out.println(bean.getNewsTitle());
System.out.println(bean.getNewsContent());
System.out.println(bean.getNewsType());
System.out.println(bean.getDeployDate());
System.out.println(bean.getCancelDate());
}
}
//第一次会从文件中读出数据,第二次就会从缓存中读取了,试着多读几次速度明显快很多。
分享到:
相关推荐
《深入理解IEC 101规约:南瑞与101报文解析》 在电力自动化领域,通信协议是实现设备间信息交换的关键。IEC 101规约,全称为“国际电工委员会第101号推荐标准”,是电力系统远动设备之间通信的一种标准协议。本文将...
标题“心电文件bmd101”表明我们关注的是一个与心电图(ECG)监测相关的设备或软件,型号为BMD101。这个设备或软件可能用于记录和分析心脏的电生理活动,以帮助医疗专业人员诊断心脏疾病。 描述中提到“bmd101的...
实验55围绕网络通信主题,主要关注STM32微控制器上的IP101GR以太网驱动。在本文中,我们将深入探讨STM32与IP101GR以太网控制器的集成,以及如何实现有效的文件驱动程序。 STM32是意法半导体(STMicroelectronics)...
### 发那科101报警处理详解 在工业自动化领域,发那科(FANUC)作为全球领先的数控系统制造商,其设备广泛应用于机床、机器人等高精度控制领域。然而,在长时间运行或特定条件下,FANUC系统可能会出现各种报警,...
《101规约》全称为“IEC60870-5-101”,是国际电工委员会(IEC)制定的一种电力系统远动通信协议,主要用于电力系统的自动化控制和数据采集。这个规约定义了设备间的通信格式、传输层协议、应用层协议等内容,确保...
**IEC101报文详解与分析** IEC101是国际电工委员会(IEC)制定的一套通信协议,主要用于电力系统自动化设备之间的数据交换。它属于IEC60870-5标准系列的一部分,是电力行业广泛应用的标准通信协议之一。IEC101报文...
STM8L101库函数是为STMicroelectronics(意法半导体)生产的STM8L101系列超低功耗微控制器设计的一套软件开发工具。这个库包含了丰富的功能,帮助开发者有效地利用STM8L101的硬件资源,进行高效、节能的嵌入式系统...
《BMD101硬件设计详解与心电监护设备开发指南》 BMD101是一款专门用于心电模块开发的集成电路,它在心电监护设备的设计与制造中扮演着核心角色。本篇文章将深入探讨BMD101的相关知识点,帮助开发者更好地理解和应用...
《深入理解IEC61850-101与104规约:基于VC++的源码解析》 电力通信系统中的IEC61850标准是国际电工委员会(IEC)制定的一套全面的自动化系统接口规范,主要用于智能变电站和电网自动化设备之间的数据交换。其中,...
在本作业中,我们关注的是GAMES101课程中的第一份作业,它涉及到了图形学中的一个重要概念——投影矩阵。GAMES101通常是一门计算机图形学的基础课程,涵盖了游戏开发和3D图形渲染的基本原理。在这个作业中,学生被...
欧姆龙 CJ1W-TC101 手册 本手册是欧姆龙 CJ1W-TC101 温度控制模块的使用手册,旨在帮助用户正确地安装、配置和使用该模块。该手册提供了详细的操作指南、注意事项和安全警告,以确保用户能够安全地使用该模块。 ...
IEC101规约,全称为“International Electrotechnical Commission 60870-5-101”,是国际电工委员会制定的一种通信规约,主要用于电力系统的远动设备间的数据交换。该规约是IEC 60870-5系列标准的一部分,设计目标是...
《主站接收数据的101协议:C++实现详解》 在电力系统通信领域,101协议,也称为IEC 60870-5-101,是一种广泛采用的标准通信协议,主要用于电力设备之间的数据交换。本文将深入探讨101协议的原理,并基于C++语言讲解...
RCMU101SN-E-4SK-D1 V1.0.6 220630 RCMU101SN-E-4SK-D1 V1.0.6 220630 是一款残余电流监控单元(Residual Current Monitoring Unit),由 Magtron 公司生产,用于检测电气系统中的漏电流。该设备能够实时监控漏电流...
【标题】"101xD 3.0_101xD3.0_xd101_101xD3.0.rar_trickdk1_" 提供的信息表明这是一个关于软件或游戏模组的更新包,名为“101xD 3.0”,可能是一个连续版本号的升级,其中“xd101”可能是该版本的一个特定标识或特征...
有关101规约的详细配置代码,该源码用于RTU间的101规约通讯
百兆以太网IC_IP101G规格书详细介绍了一款由IP101G芯片公司生产的单端口10/100兆以太网收发器,主要特性包括支持介质独立接口(MII)和简化介质独立接口(RMII),以及光纤和双绞线(TP)物理层传输。以下是该芯片的...
标题"Faster R-CNN backbone - ResNet101.zip"涉及的是计算机视觉领域的一个关键算法——Faster R-CNN(快速区域卷积神经网络),它使用ResNet101作为其基础特征提取网络。Faster R-CNN是目标检测领域的里程碑式工作...
IP101GR 数据手册翻译中文版 IP101GR 是一款单端口 10/100M 快速以太网收发器,支持自动 MDI/MDIX 功能、全双工或半双工、MII/RMII/SNI 接口、自动省电模式、基线漂移(BLW)补偿、中断功能、中继器模式等多种功能...