尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Android 常用文件操作方法

Android 常用文件操作方法
📅 发布时间:2026/6/20 18:48:06
Android 常用文件操作方法

Android 常用文件操作方法

文件压缩、md5计算

package io.github.okhttplearn.ui.screenimport android.content.Context
import android.os.Environment
import android.util.Log
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import io.github.okhttplearn.ui.theme.OkhttpLearnTheme
import io.github.okhttplearn.utils.Utils
import okio.buffer
import okio.sink
import java.io.Fileprivate const val TAG: String = "WorldScreen"@Composable
internal fun WorldScreen(modifier: Modifier = Modifier,snackBarHostState: SnackbarHostState,
) {val context: Context = LocalContext.currentval srcFile: File = remember {File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "src.txt")}val destFile: File = remember {File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "dest.gz")}Column(modifier = modifier) {Text(text = "写文件", modifier = Modifier.fillMaxWidth().padding(all = 5.dp).background(color = Color(color = 0xFFF8BBD0),shape = RoundedCornerShape(size = 5.dp)).padding(all = 5.dp).clickable {Log.i(TAG, "WorldScreen -> srcFile: $srcFile")if (srcFile.parentFile?.exists() == false) {Log.i(TAG, "WorldScreen -> isSuccess: ${srcFile.parentFile?.mkdirs()}")}srcFile.sink().buffer().use { bufferedSink ->for (i in 0 until 1000) {bufferedSink.writeUtf8("Hello World: $i")}}})Text(text = "压缩zip", modifier = Modifier.fillMaxWidth().padding(all = 5.dp).background(color = Color(color = 0xFFF8BBD0),shape = RoundedCornerShape(size = 5.dp)).padding(all = 5.dp).clickable {Log.i(TAG, "WorldScreen -> srcFile: $srcFile, destFile: $destFile")Utils.compressFileToGzip2(srcFile, destFile)})Text(text = "压缩gzip", modifier = Modifier.fillMaxWidth().padding(all = 5.dp).background(color = Color(color = 0xFFF8BBD0),shape = RoundedCornerShape(size = 5.dp)).padding(all = 5.dp))Text(text = "计算md5", modifier = Modifier.fillMaxWidth().padding(all = 5.dp).background(color = Color(color = 0xFFF8BBD0),shape = RoundedCornerShape(size = 5.dp)).padding(all = 5.dp).clickable {val md5: String = Utils.getFileMd5(destFile)Log.i(TAG, "WorldScreen -> md5: $md5")})}
}@Preview(showBackground = true)
@Composable
private fun WorldScreenPreview() {OkhttpLearnTheme {val snackBarHostState: SnackbarHostState = remember { SnackbarHostState() }WorldScreen(modifier = Modifier, snackBarHostState = snackBarHostState)}
}

工具方法

package io.github.okhttplearn.utilsimport okio.BufferedSink
import okio.BufferedSource
import okio.buffer
import okio.gzip
import okio.sink
import okio.source
import java.io.BufferedInputStream
import java.io.BufferedOutputStream
import java.io.File
import java.io.InputStream
import java.security.MessageDigest
import java.util.zip.GZIPOutputStreamprivate const val TAG: String = "Utils"internal object Utils {internal fun compressFileToGzip1(sourceFile: File, targetFile: File) {targetFile.outputStream().buffered().use { fileOutputStream: BufferedOutputStream ->GZIPOutputStream(fileOutputStream).buffered().use { gzipOutputStream: BufferedOutputStream ->sourceFile.inputStream().buffered().use { bufferedInputStream: BufferedInputStream ->bufferedInputStream.copyTo(out = gzipOutputStream)}}}}/*** ```shell* PS C:\Users\29051> (Get-FileHash -Path C:\Users\29051\Downloads\dest.gz -Algorithm MD5).Hash.ToLower()* 98cbb6b41e3a4aeec9e35dfec9351673* ```*/internal fun compressFileToGzip2(sourceFile: File, targetFile: File) {targetFile.sink().gzip().buffer().use { bufferedSink: BufferedSink ->sourceFile.source().buffer().use { bufferedSource: BufferedSource ->bufferedSource.readAll(sink = bufferedSink)}}}internal fun getFileMd5(file: File): String {val digest: MessageDigest = MessageDigest.getInstance("MD5")file.inputStream().buffered().use { inputStream: InputStream ->val bytes = ByteArray(1024 * 8)var length: Intwhile (inputStream.read(bytes).also { length = it } > 0) {digest.update(bytes, 0, length)}val md5Bytes: ByteArray = digest.digest()return md5Bytes.joinToString(separator = "") { "%02x".format(it) }}}}

zip文件压缩可以看我的这篇文章

zip文件压缩

还有的话会继续在这篇文章补充

相关新闻

  • 穿透EDA
  • 2025年热门的MEE自动复位防火阀厂家最新权威推荐排行榜
  • 2025年靠谱的不锈钢防火阀行业内知名厂家排行榜

最新新闻

  • 机器学习在弱引力透镜宇宙学中的应用:应对系统误差与分布偏移挑战
  • 2026安康防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • 从灾难性遗忘到概念瓶颈:CI-CBM实现免示例增量学习
  • 基于SAM的地质图像多任务分割:Petro-SAM框架实践与优化
  • 无需训练!3分钟上手roop-unleashed:浏览器就能玩的AI换脸神器
  • 2026年当下西安加固源头公司业内推荐:恒大加固深度解析与选型指南 - 品牌鉴赏官2026

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号