问题描述
在使用 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能解决, 最后我就真的能解决, 不管用多久, 这个问题我要解决, 那这是遇到了问题了, 如果没有遇到那么多问题怎么办, 有句话不是说没有机会就创造机会, 不断的去实践, 不断的去解决问题, 不要让自己长时间闲着, 人一旦闲着,就废了。通过实践得到的成就会让你更兴奋和开心。