如何将Android项目res/raw文件夹内的CSV文件下载到外部存储?
实现点击按钮导出res/raw目录下sample.csv到外部存储方案
1. 前置配置(AndroidManifest.xml)
首先在清单文件中声明对应权限:
<!-- Android 9及以下需要写外部存储权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <!-- Android 10以上写入公共下载目录不需要额外权限,无需额外声明 -->
如果你的targetSdkVersion为29,可在application节点添加android:requestLegacyExternalStorage="true"做兼容,targetSdkVersion >=30无需添加。
2. 页面布局配置
在Activity对应的xml布局中添加按钮控件:
<Button android:id="@+id/btn_download_csv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Download CSV" />
3. Activity逻辑代码
Kotlin版本示例
btn_download_csv.setOnClickListener { // 先判断外部存储是否可用 if (Environment.getExternalStorageState() != Environment.MEDIA_MOUNTED) { Toast.makeText(this, "外部存储不可用,导出失败", Toast.LENGTH_SHORT).show() return@setOnClickListener } // 读取res/raw下的sample.csv输入流 val inputStream = resources.openRawResource(R.raw.sample) // 构造输出文件,存放在系统公共下载目录 val outputFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "sample.csv") // 执行流拷贝 try { inputStream.use { input -> outputFile.outputStream().use { output -> input.copyTo(output) } } Toast.makeText(this, "文件已导出到下载目录:${outputFile.absolutePath}", Toast.LENGTH_LONG).show() } catch (e: Exception) { e.printStackTrace() Toast.makeText(this, "导出失败:${e.message}", Toast.LENGTH_SHORT).show() } }
Java版本示例
Button downloadBtn = findViewById(R.id.btn_download_csv); downloadBtn.setOnClickListener(v -> { if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { Toast.makeText(this, "外部存储不可用,导出失败", Toast.LENGTH_SHORT).show(); return; } InputStream inputStream = getResources().openRawResource(R.raw.sample); File outputFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "sample.csv"); try { byte[] buffer = new byte[1024]; int length; FileOutputStream outputStream = new FileOutputStream(outputFile); while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } inputStream.close(); outputStream.close(); Toast.makeText(this, "文件已导出到下载目录:" + outputFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "导出失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } });
4. 注意事项
- Android 6.0(API 23)到Android 9(API 28)版本,需要先动态申请
WRITE_EXTERNAL_STORAGE权限,用户同意后才能执行导出逻辑 - 示例中直接将文件写入公共下载目录,用户可以直接在系统的下载应用中找到导出的sample.csv文件
- 流操作需做好异常捕获和资源关闭,避免内存泄露和文件损坏
- res/raw下的资源文件名仅支持小写字母、数字和下划线,不能包含大写字母或特殊符号,否则会编译报错
内容的提问来源于stack exchange,提问作者Tanveer Hasan
相关产品推荐
相关产品推荐

