缓存List并写入文件持久化


LIfe is half spent before we know what is it.

 

缓存List并写入文件持久化

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

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

缓存工具类:

 1 package com.xinyan.springcloud.tjt;  2 
 3 
 4 import java.io.File;  5 import java.io.FileInputStream;  6 import java.io.FileOutputStream;  7 import java.io.IOException;  8 import java.io.ObjectInputStream;  9 import java.io.ObjectOutputStream; 10 import java.io.Serializable; 11 import java.util.Arrays; 12 import java.util.List; 13 
14 public class StreamUtils implements Serializable{ 15     private static final long serialVersionUID = 1L; 16     /**
17  * 序列化,List 18  * @param list 19  * @param file 20  * @param <T> 21  * @return
22      */
23     public static  <T> boolean writeObject(List<T> list,File file) 24  { 25         T[] array = (T[]) list.toArray(); 26         try(ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file))) 27  { 28  out.writeObject(array); 29  out.flush(); 30             return true; 31  } 32         catch (IOException e) 33  { 34  e.printStackTrace(); 35             return false; 36  } 37  } 38 
39     /**
40  * 反序列化,List 41  * @param file 42  * @param <E> 43  * @return
44      */
45     public static <E> List<E> readObjectForList(File file) 46  { 47  E[] object; 48         try(ObjectInputStream out = new ObjectInputStream(new FileInputStream(file))) 49  { 50             object = (E[]) out.readObject(); 51             return Arrays.asList(object); 52  } 53         catch (IOException e) 54  { 55  e.printStackTrace(); 56  } 57         catch (ClassNotFoundException e) 58  { 59  e.printStackTrace(); 60  } 61         return null; 62  } 63 
64 }

测试缓存结果:

 1 package com.xinyan.springcloud.tjt;  2 
 3 import java.io.File;  4 import java.util.ArrayList;  5 import java.util.List;  6 
 7 import lombok.extern.log4j.Log4j;  8 
 9 @Log4j 10 public class TestStreamUtils { 11     
12     private final static List<String> listSave = new ArrayList<>(); 13     private final static String  FILE_CACHE = "file-tjt"; 14     
15     public static void main(String[] args) throws Exception { 16         TestStreamUtils.saveListToJvm("admin"); 17         TestStreamUtils.saveListToJvm("user"); 18         TestStreamUtils.saveListToJvm("LieIWantTo"); 19         Object listFromJvm = TestStreamUtils.getListFromJvm(); 20         System.out.println("listFromJvm:"+listFromJvm); 21  } 22     
23     
24     public static void saveListToJvm(String input) throws Exception{ 25         List<String> listInput = new ArrayList<>(); 26  listSave.add(input); 27  listInput.addAll(listSave); 28         boolean writeObject = StreamUtils.writeObject(listInput, new File(FILE_CACHE)); 29         if (!writeObject) { 30             log.info("saveListToJvm failed!"); 31  } 32  } 33     
34     public static Object getListFromJvm() { 35         File file = new File(FILE_CACHE); 36         List<Object> readObjectForList = null; 37         if (file.exists()) { 38              readObjectForList = StreamUtils.readObjectForList(file); 39              if (readObjectForList.size() >20) { 40                 readObjectForList.remove(0); 41  } 42         }else { 43             log.info("file not exist!"); 44  } 45         return readObjectForList; 46  } 47 
48 }

测试结果如下图:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM