java - 存储在 SharedPreferences 中的字符串在每个应用程序关闭时都会被修改?
问题描述
所以,自从过去 24 小时以来,我一直在思考这个问题,在我开始之前,让我明确一点,这个问题只发生在我的一个在棉花糖上运行的 android 手机上。
问题:
当我使用 StringRequest 检索字符串响应时,该字符串正是它应该是的,然后我将它保存到 SharedPreferences,并且无论我从 SharedPreferences 检索文件多少次,该值都保持正确(即相同)。但是当我关闭应用程序并重新启动它,并从 SharedPreferences 检索字符串时,字符串会以某种方式发生变化,长度减小,与从服务器新获取的相同字符串相比,.equals 返回 false,所以我猜测 SharedPreferences 修改了字符串值在 Android marshmallow 中独立运行。经过大量调试后,我编写了两个字符串(来自 sharedpreferences 和服务器)以将 .txt 文件分隔到内部存储,并使用 notepad++ 和 Voila! 打开它们,控制字符从“CR LF”更改为'如果',因此导致字符串的长度发生变化,尽管长度不同,但当我在许多在线网站上比较两个字符串时,他们都说“字符串完全相同!” :(
帮助伙计们!谢谢
解决方案
千辛万苦,终于找到了根本原因。
在某些设备上,存储在 SharedPreferences 中的字符串值会修改其 EOL 字符。字符串中的换行符被转换为其他\n
内容,而不是减少字符串的长度。每个换行符都会将字符串的长度减少 1 位。解决方案很简单:
\n
每次从 SharedPreferences 检索字符串后,将所有换行符替换为。
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 位。:)
推荐阅读
- flutter - PlatformException(400, HTTP 状态码错误。, null)
- c++ - 如何将 STD::filesystem::recursive_directory_iterator 与相对路径一起使用?
- python - 如何向数据框添加一列,检查该行的某些或任何列中是否包含字符串?
- python-3.x - 我的 SOAP 发布响应在 Python 中未返回 200,但在 Postman 中有效
- python - 我们可以使用对象和类来存储 Python 程序的输出,比如 Excel 表中的学生详细信息吗?
- c# - 从 C# 中缺少键的列表创建完整集
- powershell - 按时间跨度将文件过滤到单个表中
- npm - 如何强制 npm publish 包含文件(条目不需要)?
- c++ - 尝试在 C++ 中生成素数时 GMP 中的链接错误
- verilog - systemverilog 中具有真实数据类型的 inout 端口