LIfe is half spent before we know what is it.

缓存List并写入文件持久化

需要缓存一个List集合,比如缓存一个输入框中用户之前输入过的内容,下次当用户再想往输入框中写东西就调用这个缓存的接口,把之前输入过的东西从缓存中取出并返回;

而为了这么一个小小的缓存,引入第三方库Redis或是Cache等也不太划算,于是就可以把缓存写入文件中,序列化到Java虚拟机中,这样就可以支持持久化,即使重启项目缓存的List依然存在;

缓存工具类:

 package com.xinyan.springcloud.tjt;

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List; public class StreamUtils implements Serializable{
private static final long serialVersionUID = 1L;
/**
* 序列化,List
* @param list
* @param file
* @param <T>
* @return
*/
public static <T> boolean writeObject(List<T> list,File file)
{
T[] array = (T[]) list.toArray();
try(ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)))
{
out.writeObject(array);
out.flush();
return true;
}
catch (IOException e)
{
e.printStackTrace();
return false;
}
} /**
* 反序列化,List
* @param file
* @param <E>
* @return
*/
public static <E> List<E> readObjectForList(File file)
{
E[] object;
try(ObjectInputStream out = new ObjectInputStream(new FileInputStream(file)))
{
object = (E[]) out.readObject();
return Arrays.asList(object);
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
return null;
} }

测试缓存结果:

 package com.xinyan.springcloud.tjt;

 import java.io.File;
import java.util.ArrayList;
import java.util.List; import lombok.extern.log4j.Log4j; @Log4j
public class TestStreamUtils { private final static List<String> listSave = new ArrayList<>();
private final static String FILE_CACHE = "file-tjt"; public static void main(String[] args) throws Exception {
TestStreamUtils.saveListToJvm("admin");
TestStreamUtils.saveListToJvm("user");
TestStreamUtils.saveListToJvm("LieIWantTo");
Object listFromJvm = TestStreamUtils.getListFromJvm();
System.out.println("listFromJvm:"+listFromJvm);
} public static void saveListToJvm(String input) throws Exception{
List<String> listInput = new ArrayList<>();
listSave.add(input);
listInput.addAll(listSave);
boolean writeObject = StreamUtils.writeObject(listInput, new File(FILE_CACHE));
if (!writeObject) {
log.info("saveListToJvm failed!");
}
} public static Object getListFromJvm() {
File file = new File(FILE_CACHE);
List<Object> readObjectForList = null;
if (file.exists()) {
readObjectForList = StreamUtils.readObjectForList(file);
if (readObjectForList.size() >20) {
readObjectForList.remove(0);
}
}else {
log.info("file not exist!");
}
return readObjectForList;
} }

测试结果如下图:

缓存List并写入文件持久化的更多相关文章

  1. python将命令输出写入文件或临时缓存

    python将命令输出写入文件 将文件写入到对应文件,方便后期处理或保存 def write_file(file_path): with open(file=file_path, mode=" ...

  2. 关于实现一个基于文件持久化的EventStore的核心构思

    大家知道enode框架的架构是基于ddd+event sourcing的思想.我们持久化的不是聚合根的最新状态,而是聚合根产生的领域事件.最近我在思考如何实现一个基于文件的eventstore.目标有 ...

  3. Shell基础-ech0,cat,history,alias,unalias,bash快捷键,wc,执行结果写入文件

    1 系统所支持的shell存放于 /etc/shells 文件中,shell脚本的开头 #!/bing/bash 是指定使用的脚本类型 不能省略,省略之后有些文件可以执行,但容易出错 这行不是注释 2 ...

  4. iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):2 H264数据写入文件

    本文档为iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):1 概述续篇,主要描述: CMSampleBufferRef读取实际数据 序列参数集(Sequence Para ...

  5. iOS 写入文件保存数据的方式

     在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeye ...

  6. php学习笔记--高级教程--读取文件、创建文件、写入文件

    打开文件:fopen:fopen(filename,mode);//fopen("test.txt","r"): 打开模式:r  仅仅读方式打开,将文件指针指向 ...

  7. 关于spark写入文件至文件系统并制定文件名之自定义outputFormat

    引言: spark项目中通常我们需要将我们处理之后数据保存到文件中,比如将处理之后的RDD保存到hdfs上指定的目录中,亦或是保存在本地 spark保存文件: 1.rdd.saveAsTextFile ...

  8. JavaScript使用localStorage缓存Js和css文件

    对于WebApp来说,将js css文件缓存到localstorage区可以减少页面在加载时与HTTP请求的交互次数,从而优化页面的加载时间.特别是当移端信号不好高延迟时优化效果还是很显见的 下面的代 ...

  9. C++按行读取和写入文件

    按行读取: 假设有一个文本文件,如下所示: 1 2 32 3 43 4 55 6 77 8 9 文件名为split.txt 目的:按照行读取数据,并一个个的显示出来. 代码如下: #include & ...

随机推荐

  1. vue文件名规范

    之前有看过一些命名规范,也看到说vue文件命名要么全是小写要么就是用小写 + '-':其实看到的时候有点不以意,因为本地能跑起项目:发布能正常访问也就OK了. 但是今天在做自动化部署的时候碰到一个问题 ...

  2. [转]addEventListener的第三个参数

    如果要把HTML元素的事件与某个函数绑定起来,可以有下面三种方法,以最常见的“点击”事件为例. 方法一: 直接在对应的HTML元素标签上绑定函数 ? 1 <button id='submit'  ...

  3. java 放射机制简介

    放射,说白了就是通过名字加载相应的类,以及类的方法和属性,是为了解决开发中不知道别人会写什么类而采取的一种顺利开发的东东. package com.io; //学生业务类 不知道别人写的 这个是别人写 ...

  4. java——类的封装

    public void setName(String str) { name=str; } public void setAge(int a) //set方法需要在括号中定义数据类型 { if(a&g ...

  5. linux消息队列相关操作

    /* 发送消息队列 */ #include <stdio.h>#include <stdlib.h>#include <string.h>#include < ...

  6. 第3章 编写ROS程序-1

    1.创建工作区和功能包 在我们写任何程序之前,第一步是创建一个容纳我们的功能包的工作区,然后再创建功能包本身. 创建工作区  使用标准的mkdir命令行去创建一个目录,我们将把这个新的目录称作工作区目 ...

  7. framework资源文件读取

    1.在framework里面读framwork自己的资源文件 这是framework内部的资源,跟其他都没有关系.但是framework不能单独存在,必须要放在某个“主程序”中才能起作用.bundle ...

  8. Mathematics Base - Tensor

    以下是我对张量的理解,备注是具体解释,Xmind导出的图片没法显示出来,主要还是将张量间的关系画出来,方便理解. 图1 张量

  9. UNPIVOT逆透视以及动态逆透视存储过程

    前几天一直练习PIVOT透视,还实现了动态透视的存过程<动态透视表>https://www.cnblogs.com/insus/p/10888277.html 今天练习MS SQL Ser ...

  10. List Control控件中及时捕获checkbox被选中的消息的解决方案

    转自:http://blog.csdn.net/vycode/article/details/7345073 我的功能需求是:用户可以在List Control里添加item,当无选项被选中(即Che ...