Android Kotlin 文件工具类 - 沙盒内文件和图像的读写和删除

Kotlin 文件工具类

沙盒内文件和图像的读写和删除。

Context 使用 应用全局上下文 ApplicationContext,在示例代码中为顶层属性 appContext

获取 应用全局上下文 ApplicationContext 的方法,请参考

Android(Kotlin)获取应用全局上下文 ApplicationContext_宋冠巡的博客-CSDN博客

代码

package com.example.fileio.util

import android.graphics.Bitmap
import android.graphics.Bitmap.CompressFormat
import android.graphics.BitmapFactory
import android.util.Log
import java.io.File

/**
 * 读文本。内部存储空间目录(沙盒)的 files 目录下。
 */
fun read(pathname: String): String {
    if (pathname.isEmpty()) {
        Log.e("sgx", "pathname 不可为空字符串")
        return ""
    }
    val file = File(appContext.filesDir, pathname)
    if (!file.exists()) {
        Log.e("sgx", "文件不存在")
        return ""
    }
    if (file.isDirectory) {
        Log.e("sgx", "文件是目录,无法读取文本")
        return ""
    }
    return file.readText()
}

/**
 * 写文本(覆盖)。内部存储空间目录(沙盒)的 files 目录下。
 */
fun write(pathname: String, text: String) {
    if (pathname.isEmpty()) {
        Log.e("sgx", "pathname 不可为空字符串")
        return
    }
    val file = File(appContext.filesDir, pathname)
    createParentDirectory(file)
    file.writeText(text)
}

/**
 * 写文本(追加)。内部存储空间目录(沙盒)的 files 目录下。
 */
fun append(pathname: String, text: String) {
    if (pathname.isEmpty()) {
        Log.e("sgx", "pathname 不可为空字符串")
        return
    }
    val file = File(appContext.filesDir, pathname)
    createParentDirectory(file)
    file.appendText(text)
}

/**
 * 遍历文件夹。内部存储空间目录(沙盒)的 files 目录下。
 */
fun walk(pathname: String): MutableList<String> {
    val fileNames = mutableListOf<String>()
    File(appContext.filesDir, pathname).walk()
//        .maxDepth(1) //需遍历的目录层级,为1,即只遍历第一层目录
//        .filter { it.isFile } // 只挑选文件,不处理文件夹
//        .filter { it.extension in listOf("png", "jpg") } // 选择扩展名为png和jpg的图片文件
        .forEach { fileNames.add(it.name) }
    return fileNames
}

/**
 * 读取图片,返回图片Bitmap。内部存储空间目录(沙盒)的 files 目录下。
 * 返回值类型为可空 Bitmap? ,否则图片不存在时会崩溃。
 */
fun readBitmap(pathname: String): Bitmap? {
    val path = appContext.filesDir.path + "/" + pathname
    return BitmapFactory.decodeFile(path)
}

/**
 * 保存图片。内部存储空间目录(沙盒)的 files 目录下。
 */
fun writeBitmap(
    bitmap: Bitmap,
    pathname: String,
    compressFormat: CompressFormat,
    quality: Int = 100
) {
    if (pathname.isEmpty()) {
        Log.e("sgx", "pathname 不可为空字符串")
        return
    }
    val file = File(appContext.filesDir, pathname)
    createParentDirectory(file)
    val outputStream = file.outputStream()
    // 压缩格式为 CompressFormat,压缩质量为 quality(80 表示 80%)
    bitmap.compress(compressFormat, quality, outputStream)
    outputStream.close()
}

/**
 * 删除文件和目录。
 * 如果是目录,会把目录中的所有子目录和子文件全部删除。
 * 如果传入的路径不存在,不会报错,会返回 true 。
 * pathname为空字符串,则删除整个 files 文件夹。
 */
fun delete(pathname: String): Boolean {
    return File(appContext.filesDir, pathname).deleteRecursively()
}

/**
 * 检查文件父目录是否存在,不存在则创建
 */
private fun createParentDirectory(file: File) {
    file.parentFile?.apply {
        // 父目录不存在,则创建
        if (!exists()) {
            mkdirs()
        }
    }
}
  1. writeText 覆盖写入文本
  2. appendText 往源文件追加文本
  3. writeBytes 覆盖写入字节数组
  4. appendBytes 追加字节数组

读写文本,遍历文件夹

调用

package com.example.fileio

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.example.fileio.util.append
import com.example.fileio.util.read
import com.example.fileio.util.walk
import com.example.fileio.util.write


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        write(
            pathname = "test/dir3/test.txt",
            text = "hello world! \n你好,安卓!\n"
        )

        val text = read(pathname = "test/dir3/test.txt")
        Log.i("sgx", text)

        append(
            pathname = "test/dir3/test.txt",
            text = "hello world! \n你好,世界!\n"
        )
        Log.i("sgx", read(pathname = "test/dir3/test.txt"))

        Log.i("sgx", walk(pathname = "test").toString())

        Log.i("sgx", "delete file:" + delete(pathname = "test/dir4/test.json"))
        Log.i("sgx", "delete directory:" + delete(pathname = "test/dir4"))
        Log.i(
            "sgx",
            "delete image:" + delete(pathname = "test/dir3/ic_user_portrait.png")
        )
    }

}

结果

  • 调用 walk 遍历文件夹

读写图片

调用

        binding.readPng.setOnClickListener {
            val bitmap = readBitmap("test/dir3/士兵.png")
            binding.imageView.setImageBitmap(bitmap)
        }
        binding.savePng.setOnClickListener {
            val bitmap = binding.imageView.drawable.toBitmap()
            writeBitmap(
                bitmap = bitmap,
                pathname = "test/dir3/soldier.png",
                compressFormat = Bitmap.CompressFormat.PNG
            )
        }
        binding.readJpg.setOnClickListener {
            val bitmap = readBitmap("test/dir3/陈独秀.jpg")
            binding.imageView.setImageBitmap(bitmap)
        }
        binding.saveJpg.setOnClickListener {
            val bitmap = binding.imageView.drawable.toBitmap()
            writeBitmap(
                bitmap = bitmap,
                pathname = "test/dir3/ChenDuXiu.jpg",
                compressFormat = Bitmap.CompressFormat.JPEG,
                quality = 80
            )
        }

效果

​         

参考

访问应用专属文件  |  Android 开发者  |  Android Developers (google.cn)

(109条消息) Kotlin技术-文件操作如此简单_天涯海风的博客-CSDN博客_kotlin 文件操作

(109条消息) Kotlin入门(27)文件读写操作_aqi00的博客-CSDN博客_android kotlin 文件读写

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋冠巡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值