package com.ydl.ydlnet.cache.diskconverter; import com.ydl.ydlnet.cache.utils.RxCacheLogUtils; import com.ydl.ydlnet.cache.utils.Utils; import com.google.gson.Gson; import com.google.gson.JsonIOException; import com.google.gson.JsonSyntaxException; import com.google.gson.TypeAdapter; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.lang.reflect.Type; /** * Created by Chu on 2017/2/28. */ public class GsonDiskConverter implements IDiskConverter { private Gson mGson = new Gson(); public GsonDiskConverter() { this(new Gson()); } public GsonDiskConverter(Gson gson) { if (gson == null) throw new NullPointerException("gson == null"); this.mGson = gson; } @Override public <T> T load(InputStream source, Type type) { T value = null; try { TypeAdapter<?> adapter = mGson.getAdapter(TypeToken.get(type)); JsonReader jsonReader = mGson.newJsonReader(new InputStreamReader(source)); value = (T) adapter.read(jsonReader); } catch (JsonIOException | JsonSyntaxException e) { RxCacheLogUtils.log(e); } catch (IOException e) { RxCacheLogUtils.log(e); } finally { Utils.close(source); } return value; } @Override public boolean writer(OutputStream sink, Object data) { try { String json = mGson.toJson(data); byte[] bytes = json.getBytes(); sink.write(bytes, 0, bytes.length); sink.flush(); return true; } catch (JsonIOException | IOException e) { RxCacheLogUtils.log(e); } finally { Utils.close(sink); } return false; } }