Android Studio Kotlin文件读取实现求助:匹配现有写入接口
实现readFile函数
以下是匹配你现有writeFile逻辑的readFile函数,可通过readFile("Filename as String")调用,返回文件内容字符串:
fun readFile(name: String): String? { val extVolumeUri: Uri = MediaStore.Files.getContentUri("external") // 与writeFile保持一致的查询条件 val selection = "${MediaStore.MediaColumns.DISPLAY_NAME} = ? AND ${MediaStore.MediaColumns.MIME_TYPE} = ?" val selectionArgs = arrayOf(name, "text/plain") var fileUri: Uri? = null contentResolver.query( extVolumeUri, arrayOf(MediaStore.MediaColumns._ID), // 仅查询ID字段,提升效率 selection, selectionArgs, null )?.use { cursor -> if (cursor.moveToFirst()) { val idIndex = cursor.getColumnIndex(MediaStore.MediaColumns._ID) if (idIndex != -1) { val id = cursor.getLong(idIndex) fileUri = ContentUris.withAppendedId(extVolumeUri, id) } } } fileUri ?: return null // 文件不存在时返回null return try { contentResolver.openInputStream(fileUri)?.bufferedReader()?.use { reader -> reader.readText() } } catch (e: IOException) { e.printStackTrace() null } }
关键细节说明
- 查询逻辑对齐:复用
writeFile的文件名+MIME类型查询条件,确保定位到的是你之前写入的目标文件 - 资源自动管理:用
use函数自动关闭Cursor和InputStream,无需手动调用close,避免资源泄漏 - 异常处理:捕获IO异常并打印日志,避免程序崩溃,同时返回null标记读取失败
- 性能优化:仅查询
_ID字段,减少不必要的数据读取
权限注意
- Android 10(API 29)及以上:无需申请
READ_EXTERNAL_STORAGE权限,因为读取的是自身通过MediaStore创建的文件 - Android 9及以下:需在Manifest中添加
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>并动态申请权限
内容的提问来源于stack exchange,提问作者Gee
相关产品推荐
相关产品推荐

