![](/img/trans.png)
[英]Android studio, File.properties deleted after reopening the app
[英]Android studio store map<String, Integer> in file.properties with properties
我正在嘗試保存 file.properties。 我可以保存一個 <String, String> map。
但是當我嘗試保存 <String, Integer> map 時出現錯誤。
有沒有辦法保存 <String, Integer> map?
不起作用的代碼:
Map<String, Integer> int_map = new HashMap<String, Integer>();
int_map.put("Red", 4);
int_map.put("Orange-red", 3);
int_map.put("Orange", 2);
int_map.put("Green", 1);
int_map.put("Blue", 0);
Properties properties = new Properties(); // Crate properties object to store the data
for (Map.Entry<String, Integer> entry : int_map.entrySet()) {
properties.put(entry.getKey(), entry.getValue());
}
try {
properties.store(new FileOutputStream(this.getFilesDir() + "data.properties"), null);
} catch (IOException e) {
e.printStackTrace();
}
有效的代碼:
Map<String, String> map = new HashMap<String, String>();
map.put("hello", "world");
Properties properties = new Properties(); // Crate properties object to store the data
for (Map.Entry<String, String> entry : map.entrySet()) {
properties.put(entry.getKey(), entry.getValue());
}
try {
properties.store(new FileOutputStream(this.getFilesDir() + "data.properties"), null);
} catch (IOException e) {
e.printStackTrace();
}
我嘗試運行它時遇到的錯誤:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.trialanderror, PID: 24139
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.trialanderror/com.example.trialanderror.MainActivity}: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3555)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3707)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2220)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8016)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1087)
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at java.util.Properties.store0(Properties.java:836)
at java.util.Properties.store(Properties.java:820)
at com.example.trialanderror.MainActivity.onCreate(MainActivity.java:36)
at android.app.Activity.performCreate(Activity.java:7957)
at android.app.Activity.performCreate(Activity.java:7946)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3530)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3707)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2220)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8016)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1087)
這是設計使然。
從文檔中我們可以閱讀:
因為
Properties
繼承自Hashtable
,所以put
和putAll
方法可以應用於 Properties object。 強烈建議不要使用它們,因為它們允許調用者插入鍵或值不是字符串的條目。 應該改用setProperty
方法。 如果在包含非字符串鍵或值的“受損”屬性 object 上調用store
或save
方法,則調用將失敗。
(強調我的)。
換句話說,您只需要為鍵和值存儲字符串對象。 如果您有 Integer,請將其轉換為字符串,然后將其寫入屬性。 在你的情況下,而不是
properties.put(entry.getKey(), entry.getValue());
你可能想使用類似的東西
properties.setProperty(entry.getKey(), entry.getValue().toString());
// | ^-- convert Integer to String
// |
// ^--use `setProperty(String key, String value)` method instead of
// `put(K key, V value)` to let compiler enforce String as key and value
或者,如果 map 可以包含null
值,而不是獲取 NPE,您希望將其存儲為字符串"null"
使用Objects.toString(entry.getValue())
而不是entry.getValue().toString()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.