0

2 つのファイルを比較したいのですが、1 つはファイル システムにあり、もう 1 つは HTTP URL からダウンロードされています。

byte[] 配列(Apache の HTTPRequestBuilder を使用)で比較しようとしましたが、ファイルが大きすぎてメモリを使い果たす可能性があることが懸念されます。良い代替品はありますか。

4

1 に答える 1

2

InputStream一度にバッファだけを読み取ることで、2つのオブジェクトの内容を比較できます。各ストリームから「不足」したときにデータを読み取る必要があります。呼び出したときに、read実際には完全なバッファーを読み取らない可能性があることに注意してください。

バッファからの各バイトごとの比較が等しく、ストリームが同時にデータを使い果たした場合、2つのストリームは等しくなります。コードが少し厄介かもしれないと思いますが、それほど悪くはないはずです。

実際、より単純なコードの場合、それぞれInputStreamをでラップすると、パフォーマンスをあまり損なうことなく、バイトごとに比較BufferedInputStreamできます(各反復でパラメーターなしのメソッドを呼び出す)。read()

public boolean equals(InputStream x, InputStream y)
{
    // TODO: Only wrap them if they're not already buffered
    x = new BufferedInputStream(x);
    y = new BufferedInputStream(y);

    while (true)
    {
        int xValue = x.read();
        int yValue = y.read();
        if (xValue != yValue)
        {
            return false;
        }
        if (xValue == -1)
        {
            // Reached the end of both streams at the same time
            return true;
        }
    }
}
于 2012-12-11T07:19:00.050 に答える