packagecom.cc.fileDb;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.EOFException;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.OutputStream;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;/**单例模式的文件数据库工具类*/
public classFileDb {private static final Logger log = LoggerFactory.getLogger(FileDb.class);private static FileDb single=null;private static Map>> cashs = new HashMap>>();privateString baseDir ;privateFileDb(String baseDir){this.baseDir =baseDir;
File f= newFile(baseDir);if (!f.exists()) {
f.mkdirs();
}
}/*初始化文件数据库的工作目录*/
public static synchronizedFileDb getInstance(String baseDir) {if (single == null) {
single= newFileDb(baseDir);
}returnsingle;
}/*将文件对象初始化到内存*/
public synchronized List> getDataList(String dbName) throwsException{
List> res = new ArrayList>();if(single == null) throw new Exception("init db first!");if(cashs.containsKey(dbName))returncashs.get(dbName);
ObjectInputStream in= null;
File f= new File(baseDir+dbName);try{if(!f.exists())f.createNewFile();
in= new ObjectInputStream(new FileInputStream(baseDir+dbName));while(f.length()>0){
Object o=in.readObject();if(!(o instanceof HashMap))continue;
HashMap map = (HashMap) o;
res.add(map);
}
}catch(EOFException ex){
}catch(Exception e){
e.printStackTrace();
log.error(e.getLocalizedMessage());
}finally{try{
cashs.put(dbName, res);if(in!=null)in.close();
}catch(IOException e) {
log.error(e.getLocalizedMessage());
}
}returnres;
}/*添加map对象到数据库*/
public synchronized boolean add(String dbName,HashMap data) throwsException{if(!cashs.containsKey(dbName))cashs.put(dbName, getDataList(dbName));
cashs.get(dbName).add(data);return true;
}/*根据条件查找符合的第一个map对象*/
public synchronized HashMap getFirst(String dbName,HashMap param) throwsException{if(!cashs.containsKey(dbName))cashs.put(dbName, getDataList(dbName));if(cashs.get(dbName).size()==0)return null;boolean fit = true;for(HashMapitem : cashs.get(dbName)){for(String key : param.keySet()){if(!param.get(key).equals(item.get(key))){
fit= false;break;
}
}if(fit)returnitem;
fit= true;
}return null;
}/*根据条件获得全部符合的map对象*/
public synchronized List> getFits(String dbName,HashMap param) throwsException{if(!cashs.containsKey(dbName))cashs.put(dbName, getDataList(dbName));if(cashs.get(dbName).size()==0)return null;
List> ls = new ArrayList>();boolean fit = true;for(HashMapitem : cashs.get(dbName)){if(param!=null&& !param.keySet().isEmpty())for(String key : param.keySet()){if(!param.get(key).equals(item.get(key))){
fit= false;break;
}
}if(fit)ls.add(item);
fit= true;
}returnls;
}/*update更新或保存对象*/
public synchronized boolean save(String dbName,HashMap param,HashMap data) throwsException{if(!cashs.containsKey(dbName))cashs.put(dbName, getDataList(dbName));if(cashs.get(dbName).size()==0){
cashs.get(dbName).add(data);
}else{boolean fit = true;for(HashMapitem : cashs.get(dbName)){if(param!=null&& !param.keySet().isEmpty())for(String key : param.keySet()){if(!param.get(key).equals(item.get(key))){
fit= false;break;
}
}if(fit){if(data!=null&& !data.keySet().isEmpty())for(String key : data.keySet()){
item.put(key, data.get(key));
}
}
fit= true;
}
}return true;
}/*根据条件删除map信息*/
public synchronized boolean delete(String dbName,HashMap param) throwsException{if(!cashs.containsKey(dbName))cashs.put(dbName, getDataList(dbName));if(cashs.get(dbName).size()==0){return false;
}else{boolean fit = true;
List dels = new ArrayList();int i = 0;for(HashMapitem : cashs.get(dbName)){if(param!=null&& !param.keySet().isEmpty())for(String key : param.keySet()){if(!param.get(key).equals(item.get(key))){
fit= false;break;
}
}if(fit){
dels.add(i);
}
fit= true;
i++;
}
Iterator mm =dels.iterator();int j = 0;while(mm.hasNext()){int k =mm.next() ;
k-=j;
cashs.get(dbName).remove(k);
j++;
}
}return true;
}/*将map数组信息刷入到文件中*/
public synchronized boolean commit(String dbName) throwsException{if(!cashs.containsKey(dbName))return false;
File file= new File(baseDir+dbName);
ObjectOutputStream out= null;
log.info("commit"+dbName+".size="+cashs.get(dbName).size());if(cashs.get(dbName)!=null&&cashs.get(dbName).size()>0){
FileOutputStream fos= new FileOutputStream(file, false);
out= newObjectOutputStream(fos);for(HashMapo: cashs.get(dbName)){
out.writeObject(o);
}
fos.close();if(out!=null)out.close();
}else{
log.info("commit["+baseDir+dbName+"].size="+cashs.get(dbName).size()+file.delete());
}return true;
}/*清空内存中的文件数据库对象*/
public synchronized boolean clear(String dbName) throwsException{if(!cashs.containsKey(dbName)){
log.info("uninit "+dbName);return false;
}
cashs.put(dbName,new ArrayList>());return true;
}
}class MyObjectOutputStream extendsObjectOutputStream{public MyObjectOutputStream() throwsIOException {super();
}public MyObjectOutputStream(OutputStream out) throwsIOException {super(out);
}
@Overrideprotected void writeStreamHeader() throwsIOException {return;
}/*** 对象转数组
*@paramobj
*@return
*/
public static byte[] toByteArray (Object obj) {byte[] bytes = null;
ByteArrayOutputStream bos= newByteArrayOutputStream();try{
ObjectOutputStream oos= newObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
bytes=bos.toByteArray ();
oos.close();
bos.close();
}catch(IOException ex) {
ex.printStackTrace();
}returnbytes;
}/*** 数组转对象
*@parambytes
*@return
*/
public static Object toObject (byte[] bytes) {
Object obj= null;try{
ByteArrayInputStream bis= newByteArrayInputStream (bytes);
ObjectInputStream ois= newObjectInputStream (bis);
obj=ois.readObject();
ois.close();
bis.close();
}catch(IOException ex) {
ex.printStackTrace();
}catch(ClassNotFoundException ex) {
ex.printStackTrace();
}returnobj;
}
}