Подтвердить что ты не робот

Сохранение массива байтов с использованием SharedPreferences

Итак, у меня есть byte [] array, который я создал в своем приложении для Android. Я хочу использовать SharedPreferences от android, чтобы сохранить его и вернуть его снова при запуске приложения. Как я могу это сделать?

4b9b3361

Ответ 1

Вы можете сохранить массив байтов в SharedPreferences с помощью android.util.Base64.

Для сохранения:

String saveThis = Base64.encodeToString(array, Base64.DEFAULT);

Для загрузки:

byte[] array = Base64.decode(stringFromSharedPrefs, Base64.DEFAULT);

Ответ 2

Вы можете попытаться сохранить его с 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]);
    }
}

Ответ 3

Вы фактически увеличиваете размер данных при преобразовании его в строку Base64.

конечный размер двоичных данных с кодировкой Base64 равен 1,37 раза от исходного размера данных + 814 байт (для заголовков).

Это быстрее и эффективнее памяти для сохранения байта [] в SharedPreferences с помощью Charsets.ISO_8859_1

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, вам придется преобразовать байт [] в Base64 перед их сериализацией.
  • JSON не сможет понять странные символы, которые будет использоваться ISO_8859_1.

TIP: если вы хотите сохранить больше места (в случае сохранения огромного байта []) сжать байт [], прежде чем преобразовать его в любой формат (ISO или Base64)

Ответ 4

Сохранение массива в общих предпочтениях:

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 функции. Я надеюсь, что приведенный выше код поможет