Java 在android中,将资源复制到SD卡会导致文件损坏

Java 在android中,将资源复制到SD卡会导致文件损坏,java,android,Java,Android,我正在尝试使用以下代码将原始资源(它是一个zip文件)从应用程序移动到SD卡: void copyFile() throws IOException { File dest = Environment.getExternalStorageDirectory(); InputStream in = context.getResources().openRawResource(R.raw.file); OutputStream out = new FileOutputStre

我正在尝试使用以下代码将原始资源(它是一个zip文件)从应用程序移动到SD卡:

void copyFile() throws IOException {
    File dest = Environment.getExternalStorageDirectory();
    InputStream in = context.getResources().openRawResource(R.raw.file);
    OutputStream out = new FileOutputStream(dest + "/file.zip");

    // Transfer bytes from in to out
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}
但是,当我检查sd卡上的文件时,我会收到以下消息: “存档文件的格式未知或已损坏”


为什么文件复制不正确?

我对您的代码做了一些小修改:

File dest = Environment.getExternalStorageDirectory();
InputStream in = context.getResources().openRawResource(R.raw.file);
// Used the File-constructor
OutputStream out = new FileOutputStream(new File(dest, "file.zip"));

// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
try {
    // A little more explicit
    while ( (len = in.read(buf, 0, buf.length)) != -1){
         out.write(buf, 0, len);
    }
} finally {
    // Ensure the Streams are closed:
    in.close();
    out.close();
}
这一个对我很有用(不是在安卓系统上,而是在普通电脑上)。我所做的修改如下:

  • 我用了这个
  • 我使用了一个
    try-catch
    -块来确保流正在被捕获 关闭,即使在读/写时出现错误/异常
  • 我使用了更明确的(基本上是 和你的一样)因为当我告诉他该怎么做时,我感觉好多了
正如我上面所说的,我在我的电脑上试过了,效果很好。证明:

[luke@KeksDose Downloads]$ md5sum quick_action.zip 
4e45fa08f24e971961dd60c3e81b292d  quick_action.zip
[luke@KeksDose Downloads]$ md5sum quick_action_copy.zip 
4e45fa08f24e971961dd60c3e81b292d  quick_action_copy.zip

创建目标文件时,使用适当的构造函数
新建文件(dest,“file.zip”)
。。它传输了整个文件吗?整个文件正在传输,但是我注意到SD卡上的文件比资源稍大。另外,如何使用File()。由于资源正在流式传输,我需要编写缓冲区。工作正常。非常感谢。不过请注意一点,以防其他人使用此代码。确保检查卡是否未安装。有关更多信息和示例代码,请遵循此主题: