Intereting Posts
Эмулятор Android не запускается, показывая «недопустимый параметр командной строки», Outofmemeoryerror (viewpager + imagesviews) Запуск службы в фоновом режиме навсегда ..? Android Как нарисовать меньший ShapeDrawable внутри другой shapeDrawable программно WindowBackground в Android 6 (Marshmallow) Как защитить API REST для мобильных приложений? Недостаточно разрешений для устройства в Android Studio Workspace, работающем в openSUSE 13.2 Как программно показать использование данных для всех приложений? Android ViewPager не вызывает onDetach / onDestroy / onDestroyView при замене в контейнере Как перенести значок поиска SearchView в нужную сторону? Android RSA Keypair Generation – Должен ли я использовать стандартный Java / Bouncy Castle / Spongy Castle / JSch / Other? Где Android.mk должен быть? Приложение Android для приостановки / возобновления музыки другого приложения музыкального плеера Android ProgressBar.setProgressDrawable работает только один раз? Отладчик Android скрывает локальную переменную

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

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

Solutions Collecting From Web of "Сохранение массива байтов с использованием SharedPreferences"

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

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

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

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

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

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

Фактически вы увеличиваете размер данных при преобразовании его в строку 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.

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

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

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