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 }
测试结果如下图: