Android Studio/Kotlin中如何通过R.raw标识符读取res/raw目录CSV文件
使用R.raw.xxx标识符读取res/raw目录CSV文件的Kotlin实现方案
直接用Android SDK提供的资源访问接口即可实现,不需要硬写文件路径,该方案兼容性更强,不会因为项目结构调整、打包变更出现路径找不到的问题。
1. 有Context上下文场景(Activity/Fragment/Service等)直接读取
直接调用resources.openRawResource()传入对应的R.raw资源ID即可获取文件输入流,示例代码如下:
// 将CSV文件读取为完整字符串 val csvInputStream = resources.openRawResource(R.raw.question) val csvContent = csvInputStream.bufferedReader(Charsets.UTF_8).use { reader -> reader.readText() }
上述代码中的use方法会自动完成流资源的关闭,不需要手动写finally释放IO资源
2. 逐行解析CSV内容示例
如果需要直接拆分CSV内容为结构化数据,可以参考如下实现:
val questionList = mutableListOf<List<String>>() resources.openRawResource(R.raw.question).bufferedReader(Charsets.UTF_8).forEachLine { line -> // 此处为简易拆分逻辑,若CSV包含带引号的逗号、换行等特殊字符,建议使用opencsv等专用解析库处理 val rowData = line.split(",") questionList.add(rowData) }
3. 普通无Context类的读取方案
如果需要在自定义的非Android组件类中读取资源,将Context作为参数传入即可,不要使用全局静态Context避免内存泄漏:
// 示例:问答数据仓库类 class QuestionRepo(private val context: Context) { fun loadAllQuestions(): List<List<String>> { val result = mutableListOf<List<String>>() context.resources.openRawResource(R.raw.question).bufferedReader().useLines { lines -> lines.forEach { line -> result.add(line.split(",")) } } return result } }
注意:res/raw下的资源文件名只能使用小写字母、数字和下划线,否则会导致R文件无法生成对应资源ID
内容的提问来源于stack exchange,提问作者Woshy
相关产品推荐
相关产品推荐

