前言:在高通8916平台,通过自带的文件管理器拷贝文件到U盘,显示完成后拔除U盘,在电脑上发现文件有问题,或是为0b或是打不开或是大小异常。如果正常通过设置中的移除U盘就没有这个问题,故问题定位在热插拔异常。

首先我来解释下为何会出现这种问题,基于linux, write操作和read操作有一点是不同的:
read操作需要从磁盘上读取到用户需的有效数据才算结束。
而write则只需要把数据写入内存cache就返回了,所以当copy完成后,数据还位于缓存中,还没有写入磁盘。
这样做的目的是为了提高write效率,先写入缓存,后台write back再会将数据写入磁盘(与之相对的是称之为Direct IO的跳过缓存的写操作,但是会write速率比较慢)
这种机制是为了performance是不会改变的,所以这就是为何不提倡热插拔磁盘。

问题找到了,那该如何解决呢?
实时刷新、写入io流。
高通自带文件管理器相关代码:

FileHelper.java
/*** Method that copies a file** @param src The source file* @param dst The destination file* @param bufferSize The buffer size for the operation* @return boolean If the operation complete successfully*/public static boolean bufferedCopy(final File src, final File dst,int bufferSize, Program program)throws ExecutionException, CancelledOperationException {BufferedInputStream bis = null;BufferedOutputStream bos = null;FileInputStream fis = null;FileOutputStream fos = null;FileDescriptor fd = null;try {fis = new FileInputStream(src);fos = new FileOutputStream(dst);fd = fos.getFD();bis = new BufferedInputStream(fis, bufferSize);bos = new BufferedOutputStream(fos, bufferSize);int read = 0;byte[] data = new byte[bufferSize];while ((read = bis.read(data, 0, bufferSize)) != -1) {// Short circuit if we've been cancelled. Show's over :(if (program.isCancelled()) {throw new CancelledOperationException();}bos.write(data, 0, read);}bos.flush(); // flush data from the stream into the bufferfd.sync();  // confirms data to be written to the diskreturn true;} catch (Throwable e) {Log.e(TAG,String.format(TAG, "Failed to copy from %s to %d", src, dst), e); //$NON-NLS-1$// Check if this error is an out of space exception and throw that specifically.// ENOSPC -> Error No Spaceif (e.getCause() instanceof ErrnoException&& ((ErrnoException)e.getCause()).errno == OsConstants.ENOSPC) {throw new ExecutionException(R.string.msgs_no_disk_space);} if (e instanceof CancelledOperationException) {// If the user cancelled this operation, let it through.throw (CancelledOperationException)e;}return false;} finally {try {if (bis != null) {bis.close();}} catch (Throwable e) {/**NON BLOCK**/}try {if (bos != null) {bos.close();}} catch (Throwable e) {/**NON BLOCK**/}try {if (fis != null) {fis.close();}} catch (Throwable e) {/**NON BLOCK**/}try {if (fos != null) {fos.close();}} catch (Throwable e) {/**NON BLOCK**/}}}

fd.sync();同步写入即可。
在所有要write的数据写完后,执行sync命令,相当于将缓存内容强制刷入磁盘。
副作用:
首先sync是系统提供的,没有优化办法。
这样做从原来系统在后台sync(写操作会迅速返回), 变成了前台去强制sync(sync完才返回)。
好处是,sync完返回,可以保证数据安全性,不让用户在sync完之前拔掉U盘。
坏处是,用户可能需要多等一段时间。
这是一个策略问题,需要权衡。

Android L 拷贝文件到U盘异常问题相关推荐

  1. hylan:linux实用 拷贝文件到U盘

    写两点实用的: 1.linux如何进入纯命令行界面 进入快捷键:CTRL+ ALT + F1~F6  (分别对应6个终端) 退出快捷键:CTRL+ ALT + F7 备注:init打开6个终端 tty ...

  2. Mac怎么不能拷贝文件到U盘

    2019独角兽企业重金招聘Python工程师标准>>> 在日常生活中,我们常常需要把一些文件拷贝的U盘保存.但是一些使用MAC的用户,有时会遇到无法拷贝的情况.今天我们就来给大家介绍 ...

  3. matlab拷贝不进u盘,Mac无法拷贝文件到U盘怎么办

    第一次使用Mac电脑的用户朋友们有的时候会有这样的问题发生,就是新买的U盘,电脑也是新的,发现U盘和移动硬盘上的文件可以拷到电脑上,但是没有办法把电脑上的文件拷到U盘上,不知道是为什么? 其实都是格式 ...

  4. Mac不能拷贝文件到U盘?看这里就对了!

    2019独角兽企业重金招聘Python工程师标准>>> 一般正常情况下 我们在使用磁盘时 可以进行存储.删除.建立文件等操作 但是为什么Mac 不能复制拷贝文件到U盘呢? 小编根据出 ...

  5. Mac 为什么不能拷贝文件到U盘

    平时用Mac传输文件都习惯直接用聊天软件截图发送,顺手便捷,但是文件过大,网速太慢时,人们还是会依赖U盘或其他移动硬盘设备来拷贝存储东西.有时急需某个文件时,插入U盘,Mac却不能拷贝文件,真的是崩溃 ...

  6. Mac苹果电脑不能拷贝文件到U盘怎么办?

    一般正常情况下 我们在使用磁盘时 可以进行存储.删除.建立文件等操作 但是为什么Mac 不能复制拷贝文件到U盘呢? 小编根据出现的情况总结出来了几种可能性 同时给出大家相应的解决方法 一.磁盘不能正常 ...

  7. Mac不能复制拷贝文件到U盘?看这里就对了!

    2019独角兽企业重金招聘Python工程师标准>>> 一般正常情况下 我们在使用磁盘时可以进行存储.删除.建立文件等操作 但是为什么Mac不能复制拷贝文件到U盘呢? 小编根据出现的 ...

  8. Mac不能复制拷贝文件到U盘怎么办

    一般正常情况下,我们在使用磁盘时可以进行存储.删除.建立文件等操作,但是为什么Mac不能复制拷贝文件到U盘呢?小编根据出现的情况总结出来了几种可能性,同时给出大家相应的解决方法. 一.磁盘不能正常连接 ...

  9. 如何把mac照片导入u盘_苹果电脑怎么拷贝文件到u盘_苹果电脑拷贝文件到u盘的方法-系统城...

    如果有重要资料或者文件需要随身携带,很多用户都会选择拷贝到U盘上.不过苹果电脑怎么拷贝文件到u盘呢?有的小伙伴不是很了解,所以今天小编就来教大家关于苹果电脑拷贝文件到u盘的方法,一起往下看吧. 具体方 ...

最新文章

  1. 在Ubuntu 16.04.3 LTS上搭建Go语言环境实录
  2. 邮件服务的安装及简单应用
  3. webform(八)——LinQ简单增、删、改、查
  4. Laravel 某个字段更新失败的原因
  5. Spring Boot 项目瘦身指南,非常实用!
  6. 拼多多:有营销号“骗粉博出位” 将用法律武器维权
  7. ntp协议中 服务器失效怎么办,排除网络时间协议(NTP)故障
  8. windows oracle .msb not found,oracle安装, Message file sp1lang.msb not found
  9. dwg格式的计算机图,看图纸(DWG文件浏览器)
  10. 根据地理坐标查询地标 城市名称 街道名称 地标建筑
  11. Playmaker与iTween
  12. android mjpg格式,Camera常用格式MJPEG和jpeg-turbo库
  13. 从投资人发现“新大陆”,看“产融星城”为何成?
  14. web前端期末大作业 魅力广西我的家乡介绍网页制作(HTML+CSS)
  15. 数据分析与数据挖掘实战案例本地房价预测(716):
  16. 「趣小面」寻融资:前景美好,“钱”景难说
  17. 订餐系统jsp模板_基于jsp的订餐系统-JavaEE实现订餐系统 - java项目源码
  18. tsqlconnection连接datasnap出现connection closed gracefully错误的解决办法
  19. 程序人生丨想学编程,大学什么样的专业能成为一名真正的程序员?
  20. layui数据表格增加序号列(第二页从1开始 or 接上一页序号开始)

热门文章

  1. html的轮播点怎么设置,html轮播效果的实现
  2. 智慧环保领域的产业市场现状及前景分析
  3. android点击右上角图标调转,Android 图标右上角添加数字提醒
  4. TopShelf配置
  5. castep 编译安装说明
  6. 批量转换heic转jpg
  7. ZeroNet框架(ZeroFrame)API参考
  8. 卫星跟踪算法c语言,以SoC FPGA为设计平台的北斗卫星信号跟踪算法的设计
  9. nc-VMware报错
  10. abp官网下载的项目如何跑起来