【问题标题】:file comparison with memory consideration文件比较与内存考虑
【发布时间】:2012-12-11 07:14:09
【问题描述】:

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

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

【问题讨论】:

  • 您想比较这些文件只是为了看看它们是否相等还是得到它们之间的实际差异?

标签: java file memory-management bytearray file-comparison


【解决方案1】:

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

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

事实上,对于更简单的代码,如果您将每个 InputStream 包装在 BufferedInputStream 中,您可能只是逐字节比较(在每个迭代)而不会损失太多性能:

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;
        }
    }
}

【讨论】:

  • 感谢 Jon,但如果假设“InputStream x”来自 http 调用,我们是否有失去连接或任何风险的风险...?...
  • @Ahmad:连接断开的风险总是存在的,当然……你会得到一个例外。我看不出你怎么能避免这种情况。
  • @Jon...这是我关心的乔恩..我认为如果我们将整个文件放在字节数组中,风险将是最低的,这就是我正在做的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 2014-06-30
  • 2012-07-10
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多