0
    DataOutputStream lWriter = new DataOutputStream(connection.getOutputStream());

    int bytesRead = 0;
    int offset = 0;
    byte[] bytes = new byte[1048576]; // read 1MB at a time
    RandomAccessFile f = new RandomAccessFile(xmlFile, "rw");
    while(bytesRead != -1){
        offset += f.read(bytes, offset, bytes.length);
        if (bytesRead != -1){
             lWriter.write(bytes, 0, bytes.length);
        }
}

このコードでは、f.read()でインデックスの範囲外の例外が発生しています。引数offsetとlengthを誤って使用している可能性があります。チャンクを読み込むたびに、オフセットをチャンクのサイズに移動する必要がありますか?たぶん、私は一度に読む量を減らして、より小さなバッファを使用する必要がありますか?

現在、この実装は機能していますが、メモリ使用量が心配です。

DataOutputStream lWriter = new DataOutputStream(connection.getOutputStream());      
lWriter.write(fileToBytes(xmlFile));

助けてくれてありがとう!

4

1 に答える 1

1

Java でストリームをコピーする正規の方法は次のとおりです。

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
    // bytesRead += count; // if you are counting
}

ループには多数のエラーが含まれています。オフセットは、ファイルではなくバッファーへのオフセットであり、ほとんど使用する必要はありません。オフセットを進める必要はありません。bytesRead をテストしていますが、初期化後に設定することはありません。カウントを進める前にEOSをチェックしていません。書き込み時に読み取りカウントを使用していないため、ジャンクをファイルに書き込んでいます。

于 2013-02-05T22:24:19.360 に答える