Android FileOutputStream FileInputStream 读写问题记录

本文记录了在Android中使用FileOutputStream和FileInputStream进行文件读写时遇到的问题,即文件被清空且写入中文出现乱码。解决方案在于读写时指定编码。作者强调了解决问题的重要性,分享了从错误中学习和成长的经验,提倡主动面对并解决难题,而不是回避问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

在使用 FileOutputStream 和 FileInputStream 进行文件读写时发现大概率出现把文件清空的情况,非常费解!

文件的读取和写入代码大体如下:

try {
         input = new FileInputStream(dataFile);
         byte[] buffer = new byte[MOVE_BUFFER_LENGTH];
         int length;
         StringBuilder builder = new StringBuilder();
         while ((length = input.read(buffer)) != -1) {
             builder.append(new String(buffer, 0, length));
         }
         
         output = new FileOutputStream(dataFile);
         output.write("String".getBytes());
     } catch (Exception e) {
         e.getMessage();
     } finally {
         close(input);
         close(output);
     }

在这一段短短的代码中我一直没有认为有什么需要注意的地方,直到遇到了上面的问题, 注意: output = new FileOutputStream(dataFile); 这一段代码执行之后文件就已经被清空了, 即使你没有执行写入代码, 如果想不清空文件而在文件内容末尾写入可以加参数:output = new FileOutputStream(dataFile, true);

我遇到的问题是写入也执行了但是没有写入进去, 所以我确定是写入出了问题,原因就是我写入的字符串有中文, 读取的时候出现了乱码, 所以我在读取和写入的时候都加入编码从而解决了这个问题:

while ((length = input.read(buffer)) != -1) {
  	 builder.append(new String(buffer, 0, length, "GB18030"));
}

output.write(array.toString().getBytes("GB18030"));

解决这样一个问题竟然历时2天时间,话说一个人在职场中的能力就是解决问题的能力, 有的时候不是你技术了解的多问题就能解决的, 我发现分析方法也是非常的关键,比如我遇到这个问题, 我要写入的字符串差不多是这样的:[{"f" , "hehe???"}], 写入之后实际的文件内容是: [], 这说明内容还是有写入, 只是没有写入完全, 所以是写入的内容出了问题, 如果我一开始就从这个点去深入分析可能不会用到辣么长的时间。

在这期间小伙伴也劝我把这段方法注释掉算了, 期间我也犹豫过是否要这样做, 当我想这样做的时候我总觉得很别扭,这样做的方式不是很妥当,并没有从根本上解决问题, 其实类似这样的事件在我从毕业工作到现在遇到过很多, 刚开始我也是敷衍的解决bug,有问题的代码就注释掉, 容易出问题的地方为了项目不延期就catch住, 现在我觉得走了很多弯路, 人和人之间的巨大差别就是这样产生的, 从平时一点一滴的解决问题里面,我觉得我工作这几年技术上肯定是有提升的,但是我更喜欢这种做事方法和分析能力的提升,我相信这个bug能解决, 最后我就真的能解决, 不管用多久, 这个问题我要解决, 那这是遇到了问题了, 如果没有遇到那么多问题怎么办, 有句话不是说没有机会就创造机会, 不断的去实践, 不断的去解决问题, 不要让自己长时间闲着, 人一旦闲着,就废了。通过实践得到的成就会让你更兴奋和开心。

关注我的 Google Play 独立开发公众号
通过从零到一在 Google Play 开发出下载量 300万 APP 的经历,我将把很多精彩的故事分享到公众号,扫描下方二维码和我一起开发 APP 赚美元吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值