LIfe is half spent before we know what is it.java
緩存List並寫入文件持久化spring
須要緩存一個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 }
測試緩存結果:spa
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 }
測試結果以下圖:3d