2016-12-30 4 views
2

Я пытаюсь сохранить пользовательские настройки в файл, откуда я могу прочитать его позже. Но я не могу заставить его работать правильно. Я пробовал читать, но у меня все еще есть проблемы.Как сохранить HashMap в файл на Android?

Map<String, String> userSettings = new HashMap<>(); 

public void updateUserSettings(){ 

     userSettings.clear(); 

     userSettings.put("item0", item0); 
     userSettings.put("item1", item1); 
     userSettings.put("item2", item2); 
     userSettings.put("item3", item3); 
     userSettings.put("item4", item4); 
     userSettings.put("item5", item5); 
     userSettings.put("item6", item6); 
     userSettings.put("item7", item7); 


     userSettings.put("i0", Float.toString(i0)); 
     userSettings.put("i1", Float.toString(i1)); 
     userSettings.put("i2", Float.toString(i2)); 
     userSettings.put("i3", Float.toString(i3)); 
     userSettings.put("i4", Float.toString(i4)); 
     userSettings.put("i5", Float.toString(i5)); 
     userSettings.put("i6", Float.toString(i6)); 
     userSettings.put("i7", Float.toString(i7)); 

     userSettings.put("huvudMaskin", huvudMaskin); 
     userSettings.put("minorMaskin1", minorMaskin1); 
     userSettings.put("minorMaskin2", minorMaskin2); 

     userSettings.put("maskinTid", Float.toString(maskinTid)); 
     writeSettings(); 
    } 



public void writeSettings() { 
    try 
    { 
     FileOutputStream fos = context.openFileOutput("test.ser", Context.MODE_PRIVATE); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(userSettings); 
     oos.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 


public void readSetttings() { 
    try 
    { 
     FileInputStream fileInputStream = new FileInputStream(context.getFilesDir()+"test.ser"); 
     ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 
     Map myHashMap = (Map)objectInputStream.readObject(); 
     userSettings = null; 
     userSettings = myHashMap; 
    } 
    catch(ClassNotFoundException | IOException | ClassCastException e) { 
     e.printStackTrace(); 
    } 
    executeSettings(); 
} 

У меня есть права на чтение и запись на приложение.

Я не получаю ничего из этого. Я проверил hashmap, и он работает по назначению. Я также пробовал много разных подходов, и единственное, что мне удалось получить, - это сохранить строки в файл .txt.

+0

«Я ничего не получаю от этого». Это ваша проблема? Пожалуйста, будьте более конкретными, если хотите, чтобы мы поняли. – davidxxx

+0

FileOutputStream.flush(), а затем закройте его! – Fang

+0

@Jason Эти вещи автоматически смываются при закрытии. Это не проблема. – GhostCat

ответ

0
public void writeSettings() { 
    try 
    { 
     FileOutputStream fos = new FileOutputStream("test.ser"); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(userSettings); 
     oos.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void readSetttings() { 
    try 
    { 
     FileInputStream fileInputStream = new FileInputStream("test.ser"); 
     ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 
     Map myHashMap = (Map)objectInputStream.readObject(); 
     userSettings = null; 
     userSettings = myHashMap; 
    } 
    catch(ClassNotFoundException | IOException | ClassCastException e) { 
     e.printStackTrace(); 
    } 
    executeSettings(); 
} 

вопрос только с файловой дорожкой.

0

Ваша проблема очень проста: вы используете два разных имени файла при записи данных соответственно. прочитав его.

FileOutputStream fos = context.openFileOutput("test.ser", Context.MODE_PRIVATE); 

против

FileInputStream fileInputStream = new FileInputStream(context.getFilesDir()+"test.ser"); 

И, скорее всего, ваши чтения код сделали бросить IOException на вас, говорит вам что-нибудь о попытке открыть файл, который не существует.

Таким образом, реальный отвод/ответ здесь: внимательно прочитайте эти сообщения об исключениях. Как правило, они точно говорят вам, в чем проблема!

+0

Да, я получаю сообщение о том, что файл не существует. «W/System.err: java.io.FileNotFoundException: ...» – JesperN

+0

См., Как я уже сказал: прочитайте сообщение. Когда вы не можете прочитать файл ... проверьте имена, которые вы используете! – GhostCat

0

Изменить эти строки:

public void readSetttings(){ 
    String path=context.getFilesDir() + File.seprator + "test.ser"; 
    if(! new File(path).exists()){ 

     //throw NullPointerException ; 
     //return; 
     /* 
     *you can choose one of these 
     *pay attention : when choose NullPointerException you shold add throws Exceptions on your method 
     */ 
    } 
    try{ 
     FileInputStream fileInputStream =context.openFileInput("test.ser"); 
     ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 
     Map myHashMap = (Map)objectInputStream.readObject(); 

     userSettings = myHashMap; 
    }catch(ClassNotFoundException | IOException | ClassCastException e) { 
     e.printStackTrace(); 
    } 
    executeSettings(); 
} 
1
private String subFolder = "/userdata"; 
private String file = "test.ser"; 

public void writeSettings() { 
    File cacheDir = null; 
    File appDirectory = null; 

    if (android.os.Environment.getExternalStorageState(). 
      equals(android.os.Environment.MEDIA_MOUNTED)) { 
     cacheDir = getApplicationContext().getExternalCacheDir(); 
     appDirectory = new File(cacheDir + subFolder); 

    } else { 
     cacheDir = getApplicationContext().getCacheDir(); 
     String BaseFolder = cacheDir.getAbsolutePath(); 
     appDirectory = new File(BaseFolder + subFolder); 

    } 

    if (appDirectory != null && !appDirectory.exists()) { 
     appDirectory.mkdirs(); 
    } 

    File fileName = new File(appDirectory, file); 

    FileOutputStream fos = null; 
    ObjectOutputStream out = null; 
    try { 
     fos = new FileOutputStream(fileName); 
     out = new ObjectOutputStream(fos); 
     out.writeObject(userSettings); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fos != null) 
       fos.flush(); 
      fos.close(); 
      if (out != null) 
       out.flush(); 
      out.close(); 
     } catch (Exception e) { 

     } 
    } 
} 


public void readSetttings() { 
    File cacheDir = null; 
    File appDirectory = null; 
    if (android.os.Environment.getExternalStorageState(). 
      equals(android.os.Environment.MEDIA_MOUNTED)) { 
     cacheDir = getApplicationContext().getExternalCacheDir(); 
     appDirectory = new File(cacheDir + subFolder); 
    } else { 
     cacheDir = getApplicationContext().getCacheDir(); 
     String BaseFolder = cacheDir.getAbsolutePath(); 
     appDirectory = new File(BaseFolder + subFolder); 
    } 

    if (appDirectory != null && !appDirectory.exists()) return; // File does not exist 

    File fileName = new File(appDirectory, file); 

    FileInputStream fis = null; 
    ObjectInputStream in = null; 
    try { 
     fis = new FileInputStream(fileName); 
     in = new ObjectInputStream(fis); 
     Map<String, String> myHashMap = (Map<String, String>) in.readObject(); 
     userSettings = myHashMap; 
     System.out.println("count of hash map::"+userSettings.size() + " " + userSettings); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (StreamCorruptedException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }finally { 

     try { 
      if(fis != null) { 
       fis.close(); 
      } 
      if(in != null) { 
       in.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Спасибо за прилагаемое усилие. Я попробовал ваш метод, и он работал как шарм. Чувствует, что лучше использовать множество функций безопасности. – JesperN

0

Если это только примитивы, которые вы хотите сохранить, то вы должны использовать SharedPreferences, которая Android обеспечивает из коробки.

public static final String PREFS = "usersettings"; 

@Override 
protected void onCreate(Bundle b){ 
    ..... 

    // read user settings on start 
    SharedPreferences settings = getSharedPreferences(PREFS, 0); 
    int someId = settings.getInteger("someId", 0); 
    setSomeId(id); 
} 

@Override 
protected void onStop(){ 

    ..... 

    SharedPreferences settings = getSharedPreferences(PREFS, 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putInteger("someId", mSomeId); 

    // commit changes on exit 
    editor.commit(); 
}