所以我有一个byte [] array
我在我的 android 应用程序中创建的。我想使用来自 android 的 SharedPreferences 来存储它并在我启动我的应用程序时再次检索它。我怎样才能做到这一点 ?
问问题
25193 次
5 回答
118
您可以使用 android.util.Base64 在 SharedPreferences 中保存一个字节数组。
为了节省:
String saveThis = Base64.encodeToString(array, Base64.DEFAULT);
加载:
byte[] array = Base64.decode(stringFromSharedPrefs, Base64.DEFAULT);
于 2014-02-18T01:39:53.970 回答
26
当您将数据转换为 Base64 字符串时,您实际上会扩大数据的大小。
Base64 编码的二进制数据的最终大小等于原始数据大小的 1.37 倍 + 814 字节(对于标头)。
使用Charsets.ISO_8859_1在 SharedPreferences 中保存 byte[] 更快且内存效率更高
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();
}
- ISO_8859_1 保留您的数据(与 UTF-8 和 UTF-16 不同)
- 如果您要在应用程序外部传输这些字节,例如使用 JSON,那么您必须在序列化它们之前将 byte[] 转换为 Base64。
- JSON 将无法理解 ISO_8859_1 将使用的奇怪字符。
提示:如果您想节省更多空间(以防您节省大量字节 []),请在将其转换为任何格式(ISO 或 Base64)之前压缩字节 []
于 2016-12-27T17:40:51.653 回答
20
你可以尝试保存它有一个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]);
}
}
于 2013-10-24T03:57:06.340 回答
4
我不能赞成 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
于 2019-04-23T15:15:05.253 回答
0
在共享首选项中保存数组:
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));
}
}
实现并调用上述2个函数。我希望上面的代码有帮助
于 2013-10-24T04:11:24.327 回答