当前位置: 首页 > news >正文

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文件压缩

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

http://www.jsqmd.com/news/47392/

相关文章:

  • 2025年口碑好的废木料蒸汽锅炉厂家推荐及采购指南
  • 郑州一对一辅导机构推荐:2026年家长优选排行榜单
  • 2025年小区造雾定制厂家权威推荐榜单:景区喷雾/水雾造景/高压喷雾源头厂家精选
  • 整数拆分
  • 2025年评价高的铝板锯切专机热门厂家推荐榜单
  • 2025年蝶阀实力厂家权威推荐榜单:闸阀/止回阀/阀门源头厂家精选
  • 2025年口碑好的手动热压机厂家推荐及选购指南
  • 2025年热门的MEE自动复位防火阀厂家最新权威推荐排行榜
  • 2025年口碑好的WEX边墙轴流风机TOP品牌厂家排行榜
  • 洛谷T699642 [语言月赛 202511] 曼波 No More
  • 2025年知名的不锈钢衣柜厂家最新TOP排行榜
  • 【Linux】Ext系列文件系统 - 教程
  • 2025年靠谱的不锈钢防火阀行业内知名厂家排行榜
  • gnu与linux
  • gnu linux
  • gnu for linux
  • 如何理解 Linux 中的 登录shell 和 非登录shell,两者又有什么区别
  • 2025年评价高的开天行业优选榜
  • quick lauching of git-bash
  • 2025年口碑好的短视频代运营热门品牌推荐榜
  • Diffusion-TS:一种基于季节性-趋势分解与重构引导的可解释时间序列扩散模型​ - 指南
  • 2025年口碑好的天花明装线槽厂家最新推荐权威榜
  • 详细介绍:Redis查询优化:从“慢如蜗牛“到“快如闪电“的实战秘籍
  • 2025年质量好的静电纺丝设备配件厂家最新权威实力榜
  • 2025年质量好的数据中心机柜空调实力厂家TOP推荐榜
  • 2025年微波等离子清洗机源头厂家权威推荐榜单:射频等离子清洗机/连续式等离子清洗机/在线式微波等离子清洗机源头厂家精选
  • 2025年气动海底阀定做厂家权威推荐榜单:海底阀/罐车海底阀/海底阀气动阀源头厂家精选
  • 2025年评价高的紫外激光打标机最新TOP厂家排名
  • 烟台市一对一培训机构推荐,2026最新课外辅导权威实测排名
  • FontCreator的Unicode分类名称