千古八方的博客

  • 程序开发
    • Android
    • Spring Boot
  • 数据私有化
    • NAS
    • 私有云
    • 内网穿透
    • 服务器
  • 留言
  • 搞事
进学
为学无间断,如流水行云,日进而不已也
  1. 首页
  2. Android
  3. 正文

Android 下高效复制文件的方法

2022年6月22日 465点热度 0人点赞 0条评论

 

如果安卓8.0(API26)以上的系统,建议使用java.nio.file.Files.copy()方法。

因为如果在同一个文件系统上的话,Files.copy会调用系统的复制文件方法,此时性能开销最小。

连缓存块的操作都不需要,直接由系统内核在DMA(Direct Memory Access)处操作。 

如果两个文件不在一个文件系统上,比如一个是磁盘,一个是网络,则使用buffers缓冲区复制文件。

使用方法如下:

try {
      // 同一个系统的话,使用系统的复制功能,否则使用buffers复制
      Files.copy(in.toPath(), out.toPath(), StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
      e.printStackTrace();
}

 

如果安卓8.0(API26)以下的系统上,建议使用java.nio.filechannel复制文件。

因为nio都是块操作,有buffer,并且可以实现零拷贝。远比旧的Stream IO跑到用户空间调用系统的read()/write()方法,额外消耗cpu资源的方式好多了。

// 自动关闭资源的写法,实现closeable的资源

try (FileChannel src = new FileInputStream(in).getChannel(); FileChannel dst = new FileOutputStream(out).getChannel()) {
    dst.transferFrom(src, 0, src.size());
} catch (Exception e) {
    e.printStackTrace();
}

 

 

如果需要修改文件内容的话,使用mapper,映射到内存,此时映射的内容会直接由系统的页缓存管理,当发生修改的时候,系统页缓会存标记修改的内容为脏数据,进而触发刷写到内存。单纯的复制文件则没必要使用。

MappedByteBuffer mbb = sourceCh.map(FileChannel.MapMode.READ_ONLY, 0, sourceCh.size());

 

 

 

标签: 暂无
最后更新:2022年6月22日

千古八方

物格而后知至,知至而后意诚,意诚而后心正

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

千古八方

物格而后知至,知至而后意诚,意诚而后心正

最新 热点 随机
最新 热点 随机
火狐下远离内容农场的方法! 中国城市生活成本查询 Debian11 系统备份与灾备盘制作 Debian logwatch 自定义配置文件,根据规则忽略掉某些日志内容 Ampache 5.0 报错 The root Ampache folder has changed to ./public socat 正反向传输文件
自建NAS,选机械硬盘还是固态硬盘? 自建私有云,使用 smart 监控硬盘健康状态,出错发邮件报警 Android widget - 完全可配的炫酷仪表盘 Nextcloud私有云自动备份手机照片 Springboot从2.1.4升级到2.7.2后,访问静态资源,提示 page not found Potplayer 使用WebDav协议,播放 Nextcloud上的视频,提示 “无法在FTP/WebDav/HTTP上修改该文件夹”
分类
  • Android
  • Linux
  • NAS
  • Spring Boot
  • Windows
  • 内网穿透
  • 回忆
  • 基于NEAT的瞎几把寻思算法笔记
  • 散篇
  • 普通人的致富之路在哪里
  • 服务器
  • 未分类
  • 私有云
标签聚合
安全维护 ubuntu TrueNAS 内网穿透 群晖NAS Android Widgets NAS Android Utils Android系统编译 linux 服务器 NPS 私有云 我开源的APP Nextcloud Spring Boot 散篇 Windows
工具/友链

资源导航 – NAS、私有云存储
在线工具 – MD5、SHA、BASE64、URL编解码
在线工具 – 贷款计算器
在线工具 – IPv4/IPv6地址查询

千古八方 在 B站

千古八方 在 知乎

我的微信小程序:
微信小程序-城市生活成本查询
城市生活成本查询
库房物资流水记账簿
最近评论
Avatar photo
千古八方 发布于 1 个月前(12月28日) 重置命令是Nextcloud提供的,和哪个平台没关系。 如果报错,一般是路径或权限的问题导致的。 ...
Avatar photo
aron 发布于 1 个月前(12月24日) 博主你好 我的nextcloud管理员密码过期了 用了occ命令重置但是报错,能请教下是什么原因...
Avatar photo
千古八方 发布于 2 个月前(12月15日) 贝塞尔这个类在这里 https://gitee.com/aityu/AndroidUtils/blo...
Avatar photo
disco 发布于 2 个月前(12月05日) 有demo链接吗?贝塞尔曲线这个关键类没有写出来~
Avatar photo
HJM 发布于 3 个月前(10月20日) 必须点赞!很有效!

COPYRIGHT © 2022 千古八方的博客. ALL RIGHTS RESERVED.

京ICP备14020471号