如何将res中的Zip文件复制到Android内部存储指定路径?
问题分析与解决方案
你的代码存在几个核心问题,导致无法完成从res目录复制Zip文件到内部存储files目录的操作:
- 方向错误:代码用
openFileInput()读取内部存储的文件,而非从res目录读取源文件 - 流类型错误:Zip是二进制文件,不能用
InputStreamReader字符流处理,会破坏文件结构 - 无完整复制逻辑:仅读取了256个字符,既没有完整读取源文件,也没有写入目标文件
- 异常处理无效:空catch块无法定位失败原因
正确实现代码
将Zip文件放入res/raw目录(若没有raw目录则手动创建),然后使用以下代码完成复制:
import android.content.res.Resources; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; // 复制方法 private void copyZipFromResToFiles() { InputStream inputStream = null; FileOutputStream outputStream = null; try { // 获取res/raw下的Zip文件输入流 Resources res = getResources(); inputStream = res.openRawResource(R.raw.file); // 这里的file是你Zip文件的名称(不带.zip后缀) // 构建内部存储files目录的目标文件 File targetFile = new File(getFilesDir(), "file.zip"); // 字节流循环读写 outputStream = new FileOutputStream(targetFile); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } } catch (Exception e) { // 打印异常信息,方便排查问题 e.printStackTrace(); } finally { // 关闭流 try { if (inputStream != null) inputStream.close(); if (outputStream != null) outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } }
优化建议(可选)
使用Java 7+的try-with-resources语法,自动关闭流,简化代码:
private void copyZipFromResToFiles() { try (InputStream inputStream = getResources().openRawResource(R.raw.file); FileOutputStream outputStream = new FileOutputStream(new File(getFilesDir(), "file.zip"))) { byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } } catch (Exception e) { e.printStackTrace(); } }
注意事项
- 确保Zip文件已放入
res/raw目录,文件名不能包含中文或特殊字符 - 若要从
res/drawable或其他目录读取,需注意资源ID的对应关系,但raw目录更适合存放这类二进制文件 - 首次复制成功后,若要重新复制,可先判断目标文件是否存在,若存在则删除后再复制,避免覆盖或读取旧文件
内容的提问来源于stack exchange,提问作者AlexG
相关产品推荐
相关产品推荐

