我想比较两个文件,一个在文件系统中,另一个是从 HTTP URL 下载的。
我们尝试通过 byte[] 数组进行比较(我们使用 Apache 的 HTTPRequestBuilder),但担心文件可能太大并且可能会耗尽内存。我们有没有好的替代品。
我想比较两个文件,一个在文件系统中,另一个是从 HTTP URL 下载的。
我们尝试通过 byte[] 数组进行比较(我们使用 Apache 的 HTTPRequestBuilder),但担心文件可能太大并且可能会耗尽内存。我们有没有好的替代品。
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;
}
}
}