0

我想比较两个文件,一个在文件系统中,另一个是从 HTTP URL 下载的。

我们尝试通过 byte[] 数组进行比较(我们使用 Apache 的 HTTPRequestBuilder),但担心文件可能太大并且可能会耗尽内存。我们有没有好的替代品。

4

1 回答 1

2

InputStream您可以通过一次仅读取一个缓冲区来比较两个对象的内容。当您从每个流中“用完”时,您需要读取数据,请注意,当您调用时,您read最终可能不会真正读取完整的缓冲区。

如果来自缓冲区的每个逐字节比较都相等并且流同时用完数据,则这两个流是相等的。我怀疑代码可能有点繁琐,但应该不会太糟糕。

事实上,对于更简单的代码,如果将每个都包装InputStream在 a 中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 回答