2

あるファイルから別のファイルにデータをコピーしています。

もっと時間がかかります。どういう理由ですか?

私のコードはここにあります

    public void copyData( InputStream in, OutputStream out ) は IOException をスローします
    {
        試す
        {
            in = 新しい CipherInputStream( in, dcipher );
            int numRead = 0;
            バイト[] buf = 新しいバイト[512];
            while ( ( numRead = in.read( buf ) ) >= 0 )
            {
                out.write( buf, 0, numRead );
            }
            out.close();
            in.close();
        }
        キャッチ ( java.io.IOException e )
        {
        }
    }

4

3 に答える 3

1

コードを確認してください。メモリ不足エラーが発生しないように、バッファー サイズを増やし、1 MB に達するとすぐにデータをフラッシュしました。

理由は主に、小さなバイトの情報を書き込むのに時間がかかる小さなバッファ サイズによるものです。一度に大きなチャンクを入れる方が良いです。

これらの値は、必要に応じて変更できます。

public void copyData( InputStream in, OutputStream out ) throws IOException
{
    try
    {
        int numRead = 0;
        byte[] buf = new byte[102400];
        long total = 0;
        while ( ( numRead = in.read( buf ) ) >= 0 )
        {
            total += numRead;
            out.write( buf, 0, numRead );

            //flush after 1MB, so as heap memory doesn't fall short
            if (total > 1024 * 1024) 
             { 
                total = 0;
                out.flush();
             }
        }
        out.close();
        in.close();
    }
    catch ( java.io.IOException e )
    {
    }
}
于 2012-06-26T10:37:07.563 に答える
-1

2つの理由

  1. バッファが小さすぎます。4kb または 8kb にしてください。電話がクラッシュするまで増加し続けてから、1 ステップ戻してください。
  2. 読み取りと書き込みは、2 つの異なるスレッドで行う必要があります。読み取りが完了したら aq に置き、書き込みが完了したら q から読み取ります。q オブジェクトを同期することを忘れないでください。

このようなコードを記述する場合、CPU とメモリを最大限に使用する必要があります。スレッド上とwhileループはとてもカレッジC風です.. :)

于 2012-06-26T10:34:07.423 に答える