java - 存储在 SharedPreferences 中的字符串在每次应用程序关闭时都会被修改吗?

标签 java android json string android-sharedpreferences

所以,自过去 24 小时以来,我一直在思考这个问题,在开始之前,让我澄清一下,这个问题仅发生在我的一部在 Marshmallow 上运行的 Android 手机上。

问题:

当我使用 StringRequest 检索字符串响应时,该字符串正是其应有的样子,然后我将其保存到 SharedPreferences,并且无论我从 SharedPreferences 检索文件多少次,该值都保持正确(即相同)。但是当我关闭应用程序并重新启动它,并从 SharedPreferences 检索字符串时,字符串会以某种方式发生变化,长度减少,与从服务器新获取的相同字符串相比,.equals 返回 false,所以我猜测 SharedPreferences 修改了字符串值在 Android Marshmallow 中独立存在。 经过大量调试后,我将两个字符串(从共享首选项以及服务器)写入单独的.txt文件到内部存储,并用 Notepad++ 打开它们,瞧!,控制字符从“CR LF”更改为'LF',从而导致字符串的长度发生改变,虽然长度不同,但当我在许多在线网站上比较这两个字符串时,他们都说“字符串完全相同!” :(

救救大家吧! 谢谢

最佳答案

经过一番折腾,终于找到了根本原因。 在某些设备上,SharedPreferences 中存储的字符串值的 EOL 字符会被修改。字符串中的换行符会转换为 \n 以外的内容,从而减少字符串的长度。每个换行符都会将字符串的长度减少 1 位数字。 解决方案很简单:

每次从 SharedPreferences 检索字符串后,将所有换行符替换为 \n

String fixedString = problemString.replace(System.getProperty("line.separator"),"\\\n" );

如果您的字符串包含手动格式化的字符串,其中包含 \n 以外的换行符,您应该使用:

String fixedString = problemString.replace("\r\n|\n|\r", "\\\n");

更新

如果您有一个已经使用 unix EOL 字符格式化的字符串,则上述解决方案将导致问题,如果您有多个使用不同 EOL 字符格式化的字符串,则无法使用该解决方案。所以我发现的最好的方法是简单地仅替换 \r

表示的回车符
String fixedString = brokenString.replace("\r", "");

此方法将删除字符串中的所有回车符,以便字符串从 (Windows CR LF) 格式转换为 (Unix LF) 格式。每换行一次,长度就会减少 1 位。 :)

关于java - 存储在 SharedPreferences 中的字符串在每次应用程序关闭时都会被修改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50387991/

相关文章:

java - 将自定义 ArrayList 中具有相同日期的元素分组

java - 为什么 -1 右移 1 = -1 在 Java 中?

java - 带复位功能的定时器

android - Android-将MP3从立体声编码为单声道

c# - 解析包含数组和对象的json文件

java - 字节码——公共(public)属性和私有(private)属性的区别

android - 用于处理未接来电的 PhoneGap 插件

android - 写入文件.properties

c++ - 在 C++ 中解析 JSON 数组

java - 解析 json 错误 : java. lang.IllegalStateException: Not a JSON Object: