首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android程序向SD卡写入文件,文件0KB有关问题【】

2012-05-08 
android程序向SD卡写入文件,文件0KB问题【在线等】有几年没来CSDN了,100不够再加,只要大家提出自己的看法。Ja

android程序向SD卡写入文件,文件0KB问题【在线等】
有几年没来CSDN了,100不够再加,只要大家提出自己的看法。

Java code
private 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()

热点排行