我在我的安卓应用程序中创建了一个 byte [] array
,现在想使用Android提供的SharedPreferences来存储它,并在下次启动我的应用程序时重新获取它。怎样做呢?
我在我的安卓应用程序中创建了一个 byte [] array
,现在想使用Android提供的SharedPreferences来存储它,并在下次启动我的应用程序时重新获取它。怎样做呢?
你可以使用android.util.Base64在SharedPreferences中保存字节数组。
保存时:
String saveThis = Base64.encodeToString(array, Base64.DEFAULT);
加载中:
byte[] array = Base64.decode(stringFromSharedPrefs, Base64.DEFAULT);
Base64.NO_WRAP
而不是Base64.DEFAULT
。在我的看法中,没有必要在首选项中使用换行符。 - rekire使用Charsets.ISO_8859_1在SharedPreferences中保存byte[]更快且内存效率更高。Base64编码二进制数据的最终大小等于原始数据大小的1.37倍+814个字节(用于标头)。
private static final String PREF_NAME = "SharedPreferences_Name";
private static final String DATA_NAME = "BytesData_Name";
public static byte[] getBytes(Context ctx) {
SharedPreferences prefs = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
String str = prefs.getString(DATA_NAME, null);
if (str != null) {
return str.getBytes(Charsets.ISO_8859_1);
}
return null;
}
public static void setBytes(Context ctx, byte[] bytes) {
SharedPreferences prefs = ctx.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor e = prefs.edit();
e.putString(DATA_NAME, new String(bytes, Charsets.ISO_8859_1));
e.commit();
}
提示:如果您想节省更多空间(例如在保存大量byte[]时),请在将其转换为任何格式(ISO或Base64)之前压缩byte[]。
SharedPreferences
。根据保存键值对:"如果你有一个相对较小的键值集合需要保存,应该使用SharedPreferences API。" - Edward Brey你可以尝试将它保存为一个String
:
存储数组:
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("myByteArray", Arrays.toString(array));
获取数组:
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
String stringArray = settings.getString("myByteArray", null);
if (stringArray != null) {
String[] split = stringArray.substring(1, stringArray.length()-1).split(", ");
byte[] array = new byte[split.length];
for (int i = 0; i < split.length; i++) {
array[i] = Byte.parseByte(split[i]);
}
}
Arrays.toString(array)
时,它会创建一个形如"[1, 2, 3, 4]"的字符串。所以substring()
是为了去掉方括号,而split()
则是为了得到一个包含单个数字的字符串数组,这样我们就可以轻松地将它们解析成字节。 - Francis我无法给Ariel Yust的回答点赞,但它完美地解决了问题。
其他答案(如Base64编码器)对于我的最低API版本不可用,或者不能保留原始值(在加密/解密数据时可能会有问题)
作为补充,我建议在kotlin中使用扩展:
val String.toPreservedByteArray: ByteArray
get() {
return this.toByteArray(Charsets.ISO_8859_1)
}
val ByteArray.toPreservedString: String
get() {
return String(this, Charsets.ISO_8859_1)
}
val string = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE).getString("string", "") ?: ""
val byteArray = string.toPreservedByteArray
在共享首选项中保存数组:
public static boolean saveArray()
{
SharedPreferences sp = SharedPreferences.getDefaultSharedPreferences(this);
SharedPreferences.Editor mEdit1 = sp.edit();
mEdit1.putInt("Status_size", byteArr.size()); /* byteArr is an array */
for(int i=0;i<byteArr.size();i++)
{
mEdit1.remove("Status_" + i);
mEdit1.putString("Status_" + i, byteArr.get(i));
}
return mEdit1.commit();
}
从共享首选项中加载数组数据:
public static void loadArray(Context mContext)
{
Shared Preferences mSharedPreference1 = PreferenceManager.getDefaultSharedPreferences(mContext);
byteArr.clear();
int size = mSharedPreference1.getInt("Status_size", 0);
for(int i=0;i<size;i++)
{
byteArr.add(mSharedPreference1.getString("Status_" + i, null));
}
}
实现并调用上述两个函数。希望以上代码能够帮助到您。