package com.ectrip.cyt.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.StreamCorruptedException; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Build; import com.ectrip.cyt.config.MyApp; /** * 2.0 * SharedPreferences工具类 */ public class SharedPreferences2Obj { private static SharedPreferences2Obj preferences2Obj=null; private Context context; private SharedPreferences sp; int __sdkLevel=10; private SharedPreferences2Obj(Context context) { this.context = context; } /** * @param name * 必须设置名字 */ public SharedPreferences2Obj setName(String name){ try { sp=MyApp.getInstance().savePreToSDcard(name); } catch (Exception e) { e.printStackTrace(); try { __sdkLevel= Build.VERSION.SDK_INT; sp=context.getSharedPreferences(name, (__sdkLevel > Build.VERSION_CODES.FROYO) ? 4 : 0); } catch (Exception e1) { e1.printStackTrace(); } } return this; } public static SharedPreferences2Obj getInstance(Context context){ if(preferences2Obj==null){ preferences2Obj=new SharedPreferences2Obj(context); } return preferences2Obj; } /** * 根据key和预期的value类型获取value的值 * * @param key * @param clazz * @return */ public T getValue(String key, Class clazz) { if (context == null) { throw new RuntimeException("请先调用带有context,name参数的构造!"); } return getValue(key, clazz, sp); } /** * 清除所有数据 */ public void clear(){ try { Editor editor = sp.edit(); editor.clear(); editor.commit(); } catch (Exception e) { e.printStackTrace(); } } public void clearKeyVal(String key){ try { Editor editor = sp.edit(); editor.putString(key,""); editor.commit(); } catch (Exception e) { e.printStackTrace(); } } /** * 针对复杂类型存储<对象> * * @param key * @param val */ public void setObject(String key, Object object) { ByteArrayOutputStream baos=null; ObjectOutputStream out = null; try { baos= new ByteArrayOutputStream(); out = new ObjectOutputStream(baos); out.writeObject(object); String objectVal = new String(Base64.encode(baos.toByteArray())); Editor editor = sp.edit(); editor.putString(key, objectVal); editor.commit(); } catch (IOException e) { e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); }finally { try { if (baos != null) { baos.close(); } if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } } @SuppressWarnings("unchecked") public T getObject(String key, Class clazz) { if (sp.contains(key)) { String objectVal =null; byte[] buffer =null; ByteArrayInputStream bais=null; ObjectInputStream ois = null; try { objectVal=sp.getString(key, null); buffer= Base64.decode(objectVal); bais = new ByteArrayInputStream(buffer); ois = new ObjectInputStream(bais); T t = (T) ois.readObject(); return t; } catch (StreamCorruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } finally { try { if (bais != null) { bais.close(); } if (ois != null) { ois.close(); } } catch (IOException e) { e.printStackTrace(); } } } return null; } /** * 对于外部不可见的过渡方法 * * @param key * @param clazz * @param sp * @return */ @SuppressWarnings("unchecked") private T getValue(String key, Class clazz, SharedPreferences sp) { T t; try { t = clazz.newInstance(); if (t instanceof Integer) { return (T) Integer.valueOf(sp.getInt(key, 0)); } else if (t instanceof String) { return (T) sp.getString(key, ""); } else if (t instanceof Boolean) { return (T) Boolean.valueOf(sp.getBoolean(key, false)); } else if (t instanceof Long) { return (T) Long.valueOf(sp.getLong(key, 0L)); } else if (t instanceof Float) { return (T) Float.valueOf(sp.getFloat(key, 0L)); } } catch (InstantiationException e) { e.printStackTrace(); LogUtil.e("system", "类型输入错误或者复杂类型无法解析[" + e.getMessage() + "]"); } catch (IllegalAccessException e) { e.printStackTrace(); LogUtil.e("system", "类型输入错误或者复杂类型无法解析[" + e.getMessage() + "]"); }catch(Exception e){ e.printStackTrace(); LogUtil.e("system", "无法找到" + key + "对应的值"); } return null; } }