java怎样将数据保存到缓存中,之后再保存

java怎样将数据保存到缓存中,之后再保存,第1张

Java中可以使用队列来保存数据,当使用的时候,加上锁,防止其他进程访问,当不用的时候保存到数据库里面,示例如下:

package comhenry;
import javautilHashMap;
import javautilMap;
import javautilRandom;
import javautilconcurrentlocksReadWriteLock;
import javautilconcurrentlocksReentrantReadWriteLock;
public class CacheDataTest {
 static Map<Integer,Object> dataMap=new HashMap<Integer,Object>();
 static ReadWriteLock lock=new ReentrantReadWriteLock();//创建读写锁的实例
 static Object getData(Integer key){
  lockreadLock()lock();//读取前先上锁
  Object val=null;
  try{
   val=dataMapget(key);
   if(val == null){
    // Must release read lock before acquiring write lock
    lockreadLock()unlock();
    lockwriteLock()lock();
    try{
     //可能已经由其他线程写入数据
     if(val==null){
      //dataMapput(key, "");//query from db
      val=queryDataFromDB(key);
     }
    }finally{
     //Downgrade by acquiring read lock before releasing write lock
     lockreadLock()lock();
     // Unlock write, still hold read
     lockwriteLock()unlock();
    }
   }
  }finally{
   lockreadLock()unlock();//最后一定不要忘记释放锁
  }
  Systemoutprintln("get data key="+key+">val="+val);
  return val;
 }
 
 static Object queryDataFromDB(Integer key){
  Object val=new Random()nextInt(1000);
  dataMapput(key, val);
  Systemoutprintln("write into data key="+key+">val="+val);
  return val;
 }
 
 public static void main(String[] args) {
  for(int i=0;i<10;i++){
   new Thread(new Runnable(){public void run() {
    getData(new Random()nextInt(5));
   }})start();
  }
 }
}

1、首先相邻的数据元素存放于相邻的内存地址中,整块内存地址是连续的。
2、其次根据元素的位置直接计算出内存地址,直接进行读取。
3、最后读取一个特定位置元素的平均时间复杂度为O即可。

java中所有数据的传输都是通过字节流的形式,包括文件或。
那么当你要读取一个文件时,首先将文件的绝对路径告诉java,调用对应的api就可以拿到该文件的字节流,下面是一段读取xml文件的例子
SAXReader reader = new SAXReader();
Document document = null;
try {
InputStream in = thisgetClass()getResourceAsStream(xmlPath);
document = readerread(in);
} catch (Exception e) {
eprintStackTrace();
return;
}
在这段代码中的SAXReader和Document是xml的工具类,无视就好了。
重点是InputStream in = thisgetClass()getResourceAsStream(xmlPath); 这句
xmlPath就是文件的绝对路径,比如D:/abc/testxml
InputStream就是该文件的输入流,接下来就可以通过它得到文件里的数据,或者转存到其他地方。

长期存储数据,即把数据(如内存中的)保存到可永久保存的存储设备中(如硬盘、U盘),也就是人们常说的持久化。

常用持久化的方案有数据库、XML文件和文件存储。

数据库是按照数据结构来存储和管理数据的仓库,后文不再做详细介绍。

XML是可扩展标记语言,最早是为了简化Internet的文档数据传输,它提供统一的语法格式来描述数据的结构,通常XML文件用于一些少量且无特殊类型要求的文本存储。示例代码使用W3C标准的接口生成XML:

import javaioFileOutputStream;
import javaioPrintWriter;
import javaxxmlparsersDocumentBuilderFactory;
import javaxxmltransformOutputKeys;
import javaxxmltransformTransformer;
import javaxxmltransformTransformerFactory;
import javaxxmltransformdomDOMSource;
import javaxxmltransformstreamStreamResult;
import orgw3cdomDocument;
import orgw3cdomElement;
public class $ {
    public static void main(String[] args) throws Exception {
        Document document = DocumentBuilderFactorynewInstance()newDocumentBuilder()newDocument();
        //创建根节点为students的XML文件
        Element students = documentcreateElement("students");
        documentappendChild(students);
        //在根节点下创建一个子节点学生
        Element student = documentcreateElement("student");
        studentsappendChild(student);
        //创建节点学生姓名,值为张三
        Element name = documentcreateElement("name");
        nameappendChild(documentcreateTextNode("张三"));
        studentappendChild(name);
        //创建节点学生年龄,值为18
        Element age = documentcreateElement("age");
        ageappendChild(documentcreateTextNode("18"));
        studentappendChild(age);
        //创建节点学生编号,值为150101
        Element number = documentcreateElement("number");
        numberappendChild(documentcreateTextNode("150101"));
        studentappendChild(number);
        //在根节点下创建第二个子节点学生
        student = documentcreateElement("student");
        studentsappendChild(student);
        //创建节点学生姓名,值为李四
        name = documentcreateElement("name");
        nameappendChild(documentcreateTextNode("李四"));
        studentappendChild(name);
        //创建节点学生年龄,值为20
        age = documentcreateElement("age");
        ageappendChild(documentcreateTextNode("20"));
        studentappendChild(age);
        //创建节点学生编号,值为150102
        number = documentcreateElement("number");
        numberappendChild(documentcreateTextNode("150102"));
        studentappendChild(number);
        
        //将XML文件保存到硬盘
        Transformer transformer = TransformerFactorynewInstance()newTransformer();
        transformersetOutputProperty(OutputKeysENCODING, "utf-8");
        transformersetOutputProperty(OutputKeysINDENT, "yes");
        PrintWriter writer = new PrintWriter(new FileOutputStream("/home/testxml"));
        transformertransform(new DOMSource(document), new StreamResult(writer));
    }
}

无论是数据库还是XML文件,它们都使用了能让数据快速方便进出的标准规范。其它文件如propeties、json,都可以使用类似XML的方式来打包数据,然后通过Java丰富的io流接口保存到磁盘中。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13348741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-19
下一篇 2023-07-19

发表评论

登录后才能评论

评论列表(0条)

保存