android程序向SD卡写入文件,文件0KB有关问题【】
android程序向SD卡写入文件,文件0KB问题【在线等】有几年没来CSDN了,100不够再加,只要大家提出自己的看法。Ja
android程序向SD卡写入文件,文件0KB问题【在线等】
有几年没来CSDN了,100不够再加,只要大家提出自己的看法。
Java codeprivate static final int COPY_BUFFER_SIZE = 2 * 1024 * 1024; //2MB一次input = new FileInputStream(oldFile);output = new FileOutputStream(newFile);byte[] buffer = new byte[COPY_BUFFER_SIZE];while (true) { int bytes = input.read(buffer); if (bytes <= -1) { result = 1; break; } output.write(buffer, 0, bytes);}} catch (Exception e) { e.printStackTrace();} finally { // close all stream if (input != null) { input.close(); } if (output != null) { output.close(); }}//在这里显示提示信息 已复制完毕
以上是简单的复制文件代码,我就没去整理了。
情况是这样的:
做的是文件管理器,复制大约10MB的文件到SD卡,当程序提示复制完毕时,立即将SD卡拔掉(大约4秒内),此时文件大小很大几率为0KB,如果在复制成功大约4秒后,再拔出SD卡,文件就正常。
如果我把buffer设置小一点,比如COPY_BUFFER_SIZE =100,同样的,提示后立即拔掉,此时文件大小稍微丢失一点点,(大小大约为9MB多一点),如果延迟1~2秒再拔掉,文件就正常。
请问下这会是什么原因,我查了下说FileOutputStream是无缓存式写文件,所以按我的理解来说,应该是读2MB文件,就向SD卡里写入2MB。复制10MB的文件完毕立即拔出卡的时候,即使后面的几MB内容没来得及写入SD卡内,文件起码也得有个4 5MB吧。
[解决办法]向sdcard写入数据,一般写入到缓冲区,sdcard会定时同步到sdcard存储器中去的。
[解决办法]这个是linux的机制,关键是你在拔出的时候,数据还没有同步到sdcard中。数据同步是需要时间的。
[解决办法]我在sdcard mount的时候加的option 中包含sync这个选项,每次写入数据后都会同步,但是发现这样会引起mmcqd(sdcard 驱动block 线程) cpu% 占用率较高。
[解决办法]java有一个API,
FileOutputStream.getFD().sync()