日期:2014-04-15  浏览次数:20918 次

接到一个任务,让我做一个公司网站的后台管理系统。要求很简单,就一个旧事发布模块和一个招聘信息发布模块。但不能用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