java - リソースをSDカードにコピーすると、Androidで破損したファイルが表示されます

java android

次のコードを使用して、生リソース(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();
}


これは私のために働いた(Androidではなく通常のコンピューターで)。私が行った変更:


File-constructorにはFileOutputStreamを使用しました。
try-catchブロックを使用して、ストリームが確実に取得されるようにしました
読み取り/書き込み中にエラー/例外が発生した場合でも閉じられます。
より明示的なread-methodを使用しました(これは基本的に
あなたのものと同じです)私が彼に何をすべきかを言うと私は気分が良くなるから


上記で述べたように、私は自分のコンピューターでそれを試してみましたが、うまくいきました。証明:

[luke@KeksDose Downloads]$ md5sum quick_action.zip 
4e45fa08f24e971961dd60c3e81b292d  quick_action.zip
[luke@KeksDose Downloads]$ md5sum quick_action_copy.zip 
4e45fa08f24e971961dd60c3e81b292d  quick_action_copy.zip
関連記事

java - JavaScriptのような構文を自分のJavaメソッドに解析する

java - IllegalArgumentException:オブジェクトの配列をSCHEMA_SOURCEプロパティの値として使用する場合、2つのスキーマが同じtargetNamespaceを共有することはできません

java - Notnoop / java-apnsプッシュ

java - iTextを使用してJSPでPDFファイルの限られた数のページを表示する方法は?

java - サーバー側のJax-rs呼び出しをプレフィックスのないネイティブファイルと混在させる方法は?

java - プリミティブのJavaジェネリックメソッド

java - Stripes Frameworkの会話スコープ

java - AspectJでメソッドを注釈付き引数と一致させる方法

java - 金額をDoubleとして格納しますが、BigDecimalを使用して値を計算します

java - Java(Clojure)から書き込み、Paraviewで読み取ることができるデータ形式は何ですか?