java 文件储存_Java基于文件的对象存储

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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值