<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    飛艷小屋

    程序--人生--哲學___________________歡迎艷兒的加入

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      52 Posts :: 175 Stories :: 107 Comments :: 0 Trackbacks
    利用緩存機制快速讀取XML文件中的數據

           接到一個任務,讓我做一個公司網站的后臺管理系統。要求很簡單,就一個新聞發布模塊和一個招聘信息發布模塊。但不能用DB,只能用文件存取的形式實現。

           不用考慮肯定是用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<children.size(); i++) {
        child = (Element) children.get(i);
        bean = clazz.newInstance();  
        attributes = child.getChildren();
        for(int j=0; j<attributes.size(); 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());
      }
    }
    第一次會從文件中讀出數據,第二次就會從緩存中讀取了,試著多讀幾次速度明顯快很多。
     

    posted on 2005-12-03 15:03 天外飛仙 閱讀(178) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 久久久久久久岛国免费播放| 91在线亚洲综合在线| 国产亚洲综合精品一区二区三区| 桃子视频在线观看高清免费完整 | 曰批全过程免费视频播放网站| 亚洲开心婷婷中文字幕| 国产在线国偷精品免费看| 亚洲午夜久久久影院| 97无码人妻福利免费公开在线视频| 亚洲一区二区三区无码影院| 黄色视频在线免费观看| 亚洲理论电影在线观看| 最近2018中文字幕免费视频| 亚洲国产片在线观看| 嫩草影院在线免费观看| 国产成人高清亚洲一区91| 亚洲中文字幕无码爆乳AV| 在线观看肉片AV网站免费| 亚洲视频精品在线观看| 好吊妞788免费视频播放| 黄色大片免费网站| 亚洲AV无码成人精品区天堂| 波多野结衣在线免费视频 | 亚洲国产日产无码精品| 成人毛片18女人毛片免费视频未| 亚洲aⅴ无码专区在线观看春色 | 无码专区一va亚洲v专区在线| 国产精品免费久久久久影院| 亚洲AV成人精品网站在线播放| 2022久久国产精品免费热麻豆| 在线观看日本亚洲一区| 亚洲另类少妇17p| 99久久久国产精品免费牛牛 | 国产成人精品免费视频大全| 日韩精品亚洲人成在线观看 | 国产亚洲漂亮白嫩美女在线| 水蜜桃亚洲一二三四在线| 思思99re66在线精品免费观看| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 亚洲国产精品成人精品软件| 亚洲国产中文v高清在线观看|