캐시 메커니즘 읽기 xml

8952 단어 xml 읽기
첫째, 우선 Cache 클래스를 실행합니다. 대상을 읽는 방법이 있습니다. get () 파일이 수정되지 않으면 HashMap에서 대상을 꺼내고, 파일이 수정되면readObject () 방법을 사용해서 파일에서 데이터를 읽고 읽은 데이터를 HashMap에 넣고 원래의 대상을 덮어씁니다.이렇게 하면 다음에 데이터를 다시 읽을 때 캐시에서 직접 읽을 수 있고 최신 데이터임을 보증할 수 있다.파일이 수정되었는지 판단하는 방법도 있습니다. getModified ()
import java.io.File;
import java.util.HashMap;
public class Cache {
    private static Cache instance;
    
    HashMap mapLastModified = new HashMap();
    HashMap mapValues = new HashMap();
    private  Cache() {
        super();
    }    
     public static Cache getInstance()
    {
       if (instance == null)           
                instance = new Cache();
       return instance;
           
        }
    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;
    }
}

 
2. 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) {
  Element root=null;
  FileInputStream fi = null;
  try {
   fi = new FileInputStream(path);
   SAXBuilder sb = new SAXBuilder();
   Document doc = sb.build(fi);
    root= doc.getRootElement();
   
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    fi.close();
   } catch (IOException e1) {   }
  }
  return root.getChildren();
 }
}

 
세 번째는 실례화 처리된 클래스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;
 } 
}

5 마지막 테스트 결과 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.getInstance().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());
  } 
  System.out.println("Ok");
  news2 = (List)Cache.getInstance().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());
  }
}
}

첫 번째는 파일에서 데이터를 읽고, 두 번째는 캐시에서 읽기 때문에 몇 번 더 읽으면 훨씬 빠르다.
테스트의 news.xml 파일
1 jdk1.5 API 중국어 버전 news Titttle> 빨리 다운로드<<< news Content> 2005-11-11-330<<<< newsType><< newsContent > << news 중국어 버전> < News 중국어 버전> < news News Title> < News News News Contetv 5 < 5 API 중국어 버전< 5 API 중국어 버전<2005-11-302006-1-30

실행 결과: C:\java>javaMainClassget object from filenews 1jdk1.5 API 중국어 버전 빨리 다운로드 2005-11-302006-1-30news 2javaRPG 게임 빨리 다운로드 2005-11-302006-30Oknewsget object from cache1jdk 1.5 API 중국어 버전 빨리 다운로드 2005-11-302006-1-30 news 2javaRPG 게임 빨리 다운로드 2005-11-302006-1-30
C:\java>

좋은 웹페이지 즐겨찾기