读写文件出现偶尔或者少部分乱码的情况
2016-07-24 14:18
489 查看
新项目刚开始不到一个月,就接到一个用户的反馈,说是APP本地上传到后台的数据有中文乱码的情况,大概十几条数据出现一次两次。
凭直觉,这不可能是编码格式问题,不然就应该是大面积乱码了,看了源代码,也确实不是:从outputstream到inputstream,再到最后的httppost都是按照utf-8来编码的,大家开始讨论是不是后台数据编码的问题。然后开始查后台数据库,有乱码,但是编码也没有问题,问题陷入了僵局。
由于APP的sdk包是我这边提供的,领导自然把这个问题压给了我,没办法,我开始一步步的打印log,发现乱码确实出现在APP端,并且就在读取本地文件的时候发生的,但是很诡异,不是每次读取都有乱码,概率跟投诉的问题差不多,到这里问题也算是基本定位了,当然,随之而来压力也都压在我这边。但是测试了N多遍还是没找到真正的原因,随着log打印的越来越多,发现有个规律,就是文件内容少的时候基本没有乱码的情况,随着文件越来越多,乱码的概率就大了。
然后开始分析了整个数据上传逻辑:先以jsonarray格式的数据存到本地指定文件,下次再有数据就先读取这个文件,得到一个jsonarray,再把新数据一jsonobject的格式put进去,再写入文件,然后下次有新数据也是这个流程执行下去。以前没遇到过这种情况,分析了半天没头绪,请教同事。
还是有高手,有个同事说有没有可能是这么个情况导致的:就是随着本地文件数据量增大,读取和写入越来越耗时,前一次的写入还没有完成,后面的读取已经开始了。我一想有道理,起码很符合这种规律。然后就开始找相应的解决方法。
最后想到两种:
1、写入数据的时候不再读取文件,而是直接写入,相当于数据累加;
2、每次写入数据就重新创建一个文件,这个文件只存储这次的数据,下次再创建新文件。
我先试的是第二种方法,多次试验后证明确实没有了乱码的情况,考虑到这两种方法对APP性能影响都差不多,上传成功后文件都会删除,再加上上面催的紧,就没有试验第一种方法。
问题虽然得到了解决,但是验证过程中产生了两个疑问:
1、在试验新方法之前,我用log分别打印了读取和写入文件方法的进出时间,发现并没有时间重合的情况,也就是说从打印的时间上看两个动作是没有同时进行的;
2、读取和写入同时进行了,怎么就会造成乱码的情况,原理是什么?
感觉还没找到根本的原因,只是选择的方法恰好解决这个问题。
以上的操作的IDE是eclipse。
凭直觉,这不可能是编码格式问题,不然就应该是大面积乱码了,看了源代码,也确实不是:从outputstream到inputstream,再到最后的httppost都是按照utf-8来编码的,大家开始讨论是不是后台数据编码的问题。然后开始查后台数据库,有乱码,但是编码也没有问题,问题陷入了僵局。
由于APP的sdk包是我这边提供的,领导自然把这个问题压给了我,没办法,我开始一步步的打印log,发现乱码确实出现在APP端,并且就在读取本地文件的时候发生的,但是很诡异,不是每次读取都有乱码,概率跟投诉的问题差不多,到这里问题也算是基本定位了,当然,随之而来压力也都压在我这边。但是测试了N多遍还是没找到真正的原因,随着log打印的越来越多,发现有个规律,就是文件内容少的时候基本没有乱码的情况,随着文件越来越多,乱码的概率就大了。
然后开始分析了整个数据上传逻辑:先以jsonarray格式的数据存到本地指定文件,下次再有数据就先读取这个文件,得到一个jsonarray,再把新数据一jsonobject的格式put进去,再写入文件,然后下次有新数据也是这个流程执行下去。以前没遇到过这种情况,分析了半天没头绪,请教同事。
还是有高手,有个同事说有没有可能是这么个情况导致的:就是随着本地文件数据量增大,读取和写入越来越耗时,前一次的写入还没有完成,后面的读取已经开始了。我一想有道理,起码很符合这种规律。然后就开始找相应的解决方法。
最后想到两种:
1、写入数据的时候不再读取文件,而是直接写入,相当于数据累加;
2、每次写入数据就重新创建一个文件,这个文件只存储这次的数据,下次再创建新文件。
我先试的是第二种方法,多次试验后证明确实没有了乱码的情况,考虑到这两种方法对APP性能影响都差不多,上传成功后文件都会删除,再加上上面催的紧,就没有试验第一种方法。
问题虽然得到了解决,但是验证过程中产生了两个疑问:
1、在试验新方法之前,我用log分别打印了读取和写入文件方法的进出时间,发现并没有时间重合的情况,也就是说从打印的时间上看两个动作是没有同时进行的;
2、读取和写入同时进行了,怎么就会造成乱码的情况,原理是什么?
感觉还没找到根本的原因,只是选择的方法恰好解决这个问题。
以上的操作的IDE是eclipse。
相关文章推荐
- 从零开始学习设计模式——装饰者模式
- 布局技巧与列表控件
- [分类汇总] 同步与异步系列
- 自定义控件(视图)2期笔记13:View的滑动冲突之 内部拦截法
- 动态规划
- 2016夏季练习——最短路
- hdu3220 Alice’s Cube--逆向BFS & 打表 & 位运算
- Spark小课堂Week3 FirstSparkApp(Dataframe开发)
- csdn代码片教程
- CAAnimation简介
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数
- EventBus理解
- 基于Phaser框架完成FlappyBird
- Centos7配置LAMP+xcache,rpm,php模块
- ajax
- MBG 相关资源链接
- codeforces 213B div2 The Fibonacci Segment
- SpringBoot学习笔记(4) Spring Boot 集成 Mybatis
- tjut 4928
- Java 反射