Android L 拷贝文件到U盘异常问题
前言:在高通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盘异常问题相关推荐
- hylan:linux实用 拷贝文件到U盘
写两点实用的: 1.linux如何进入纯命令行界面 进入快捷键:CTRL+ ALT + F1~F6 (分别对应6个终端) 退出快捷键:CTRL+ ALT + F7 备注:init打开6个终端 tty ...
- Mac怎么不能拷贝文件到U盘
2019独角兽企业重金招聘Python工程师标准>>> 在日常生活中,我们常常需要把一些文件拷贝的U盘保存.但是一些使用MAC的用户,有时会遇到无法拷贝的情况.今天我们就来给大家介绍 ...
- matlab拷贝不进u盘,Mac无法拷贝文件到U盘怎么办
第一次使用Mac电脑的用户朋友们有的时候会有这样的问题发生,就是新买的U盘,电脑也是新的,发现U盘和移动硬盘上的文件可以拷到电脑上,但是没有办法把电脑上的文件拷到U盘上,不知道是为什么? 其实都是格式 ...
- Mac不能拷贝文件到U盘?看这里就对了!
2019独角兽企业重金招聘Python工程师标准>>> 一般正常情况下 我们在使用磁盘时 可以进行存储.删除.建立文件等操作 但是为什么Mac 不能复制拷贝文件到U盘呢? 小编根据出 ...
- Mac 为什么不能拷贝文件到U盘
平时用Mac传输文件都习惯直接用聊天软件截图发送,顺手便捷,但是文件过大,网速太慢时,人们还是会依赖U盘或其他移动硬盘设备来拷贝存储东西.有时急需某个文件时,插入U盘,Mac却不能拷贝文件,真的是崩溃 ...
- Mac苹果电脑不能拷贝文件到U盘怎么办?
一般正常情况下 我们在使用磁盘时 可以进行存储.删除.建立文件等操作 但是为什么Mac 不能复制拷贝文件到U盘呢? 小编根据出现的情况总结出来了几种可能性 同时给出大家相应的解决方法 一.磁盘不能正常 ...
- Mac不能复制拷贝文件到U盘?看这里就对了!
2019独角兽企业重金招聘Python工程师标准>>> 一般正常情况下 我们在使用磁盘时可以进行存储.删除.建立文件等操作 但是为什么Mac不能复制拷贝文件到U盘呢? 小编根据出现的 ...
- Mac不能复制拷贝文件到U盘怎么办
一般正常情况下,我们在使用磁盘时可以进行存储.删除.建立文件等操作,但是为什么Mac不能复制拷贝文件到U盘呢?小编根据出现的情况总结出来了几种可能性,同时给出大家相应的解决方法. 一.磁盘不能正常连接 ...
- 如何把mac照片导入u盘_苹果电脑怎么拷贝文件到u盘_苹果电脑拷贝文件到u盘的方法-系统城...
如果有重要资料或者文件需要随身携带,很多用户都会选择拷贝到U盘上.不过苹果电脑怎么拷贝文件到u盘呢?有的小伙伴不是很了解,所以今天小编就来教大家关于苹果电脑拷贝文件到u盘的方法,一起往下看吧. 具体方 ...
最新文章
- 在Ubuntu 16.04.3 LTS上搭建Go语言环境实录
- 邮件服务的安装及简单应用
- webform(八)——LinQ简单增、删、改、查
- Laravel 某个字段更新失败的原因
- Spring Boot 项目瘦身指南,非常实用!
- 拼多多:有营销号“骗粉博出位” 将用法律武器维权
- ntp协议中 服务器失效怎么办,排除网络时间协议(NTP)故障
- windows oracle .msb not found,oracle安装, Message file sp1lang.msb not found
- dwg格式的计算机图,看图纸(DWG文件浏览器)
- 根据地理坐标查询地标 城市名称 街道名称 地标建筑
- Playmaker与iTween
- android mjpg格式,Camera常用格式MJPEG和jpeg-turbo库
- 从投资人发现“新大陆”,看“产融星城”为何成?
- web前端期末大作业 魅力广西我的家乡介绍网页制作(HTML+CSS)
- 数据分析与数据挖掘实战案例本地房价预测(716):
- 「趣小面」寻融资:前景美好,“钱”景难说
- 订餐系统jsp模板_基于jsp的订餐系统-JavaEE实现订餐系统 - java项目源码
- tsqlconnection连接datasnap出现connection closed gracefully错误的解决办法
- 程序人生丨想学编程,大学什么样的专业能成为一名真正的程序员?
- layui数据表格增加序号列(第二页从1开始 or 接上一页序号开始)