缓存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 }

测试结果如下图:

 

posted @ 2019-05-12 16:07  涛姐涛哥  阅读(2458)  评论(0编辑  收藏  举报