`
lenj
  • 浏览: 37438 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

利用缓存机制快速读取XML文件中的数据

    博客分类:
  • 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());

  }

  }

  第一次会从文件中读出数据,第二次就会从缓存中读取了,试着多读几次速度明显快很多。
分享到:
评论

相关推荐

    利用缓存机制快速读取XML文件数据

    ### 缓存机制在XML文件数据读取中的应用 #### 一、背景介绍与问题提出 ...通过以上介绍和示例,我们可以看到利用缓存机制快速读取XML文件数据是一种有效的方法,能够在不影响系统稳定性的前提下显著提高数据访问速度。

    Xpath读取xml文件,实现文件缓存。

    在这个场景中,“Xpath读取xml文件,实现文件缓存”指的是利用XPath来高效地检索XML数据,并通过缓存机制提高后续访问的效率。这通常涉及到以下几个关键知识点: 1. **XPath语言**: XPath是一种在XML文档中查找信息...

    c,c++高手实现xml文件读写解析底层

    在C或C++中实现XML文件的读写解析底层涉及到多个关键概念和技术,下面将详细阐述这些知识点。 1. **基础概念**: - **XML语法**:XML文档遵循一套严格的语法规则,包括元素、属性、文本内容、命名空间等。正确解析...

    基于XML的移动数据传输机制.pdf

    3. 配置文件:移动应用的配置信息通常存储为XML文件,方便读取和修改。 4. 数据存储:SQLite数据库,一种轻量级的嵌入式数据库,常在Android等移动平台上用于存储结构化数据,其查询结果可以以XML格式返回。 四、...

    通用的解析xml里面的数据

    SAX则采用事件驱动模型,逐行读取XML文件,只处理当前遇到的元素,内存占用小,但需要编写更复杂的代码来处理流式数据。 针对描述中的“数据效率大大提高”,可能意味着该项目采用了优化的解析策略。例如,可能使用...

    wince 操作xml文件

    综上所述,在WinCE中操作XML文件需要熟悉.NET Compact Framework的XML处理机制,合理利用XPath和 LINQ(如果支持),并考虑到性能和错误处理。通过实践和学习,你可以有效地在嵌入式系统上实现XML数据的管理和交换。

    XML文件的解析服务

    总之,XML文件的解析服务在IT行业中扮演着重要角色,无论是在数据交换、配置管理还是文档存储,都离不开高效的解析机制。选择合适的解析方式,结合编程语言的解析库,可以确保XML数据的有效利用和高效处理。

    C#实现提高xml读写速度的方法

    综上所述,提高C#中XML文件读写速度的关键在于选择合适的API、优化数据结构、利用缓存和压缩技术,并根据实际需求采取并行处理等策略。同时,对于特定的应用场景,可能还需要进行性能测试,以找到最佳的解决方案。

    castor1-2(java and xml 数据绑定过程所需数据包)

    描述中的"利用该包内提供的java类,可以进行java读取解析xml文件,并对文件进行操作",意味着这个包包含了用于解析和操作XML文件的Java类。Castor通过其内部的API,可以方便地读取XML文件并将其内容映射到Java对象上...

    c#操作properties,读写配置文件

    1. **配置文件**: 在.NET Framework中,配置文件通常是XML格式的文件,例如`app.config`或`web.config`。这些文件包含了应用程序所需的配置数据。 2. **`System.Configuration`命名空间**: 提供了用于读取和修改...

    C# 用XML文件来实现多语言切换 Multilingual.rar

    总结,利用XML文件实现C#应用程序的多语言切换,涉及XML的读取、解析、UI元素绑定以及语言切换逻辑。通过合理的资源管理和良好的代码设计,可以使程序具有良好的可扩展性和适应性,满足不同地区用户的需求。

    书店销售管理系统(C#,Xml)

    8. **异常处理**:在处理XML文件时,可能会遇到诸如文件不存在、读写错误等问题,因此,良好的异常处理机制至关重要,它可以确保程序在遇到错误时不会突然崩溃,而是给出适当的提示信息。 9. **数据验证**:在输入...

    Unity XML框架

    - **缓存机制**:为了提高性能,框架可能会有缓存机制,避免频繁的磁盘I/O操作,尤其是对于经常读取的XML数据。 5. **错误处理** - **异常处理**:UnityXML框架通常会捕获并处理解析过程中的错误,如文件不存在、...

    vc通过xml配置用户界面

    2. **XML解析库**:VC项目中需要引入XML解析库,如TinyXML、pugixml或MSXML等,用于读取和解析XML文件。 3. **控件创建与绑定**:解析XML文件后,根据XML节点信息动态创建相应的Windows控件,并将这些控件添加到...

    一个基于xml的新闻点击率收集者

    此外,XML文件可以在内存中快速读取和解析,从而加快新闻页面的响应速度,提高用户体验。 其次,XML文件的结构化设计便于数据管理和分析。每个点击事件可以表示为一个XML元素,包含各个属性如新闻标题、链接、点击...

    xml编辑例子是一个关于网业缓存的

    在实际应用中,开发者可能使用XML文件来存储和传输缓存数据,利用ASP脚本来处理这些数据并根据需要更新缓存。此外,理解HTTP头信息,如“Cache-Control”和“ETag”,对于正确实现缓存策略也至关重要。总之,这个...

    详解Hibernate的缓存机制及其配置代码

    通过上述分析,我们可以看出Hibernate的缓存机制非常强大,合理地利用缓存可以显著提升应用程序的性能。在实际项目中,开发者需要根据具体情况选择合适的缓存策略,并正确配置缓存参数,以达到最佳效果。

    Hibernate缓存机制解说

    ## Hibernate缓存机制详解 ### 一、缓存分类与管理 Hibernate提供了两种主要的缓存类型:一级缓存和二级缓存。 #### 1. 一级缓存 一级缓存也称为Session缓存,它在同一个Session中对数据的多次读取操作只需要一...

Global site tag (gtag.js) - Google Analytics