Java 文件比较与内存考虑

Java 文件比较与内存考虑,java,file,memory-management,bytearray,file-comparison,Java,File,Memory Management,Bytearray,File Comparison,我想比较两个文件,一个在文件系统中,另一个从HTTP URL下载 我们尝试过按字节[]数组进行比较(Apache使用了HTTPRequestBuilder),但问题是文件可能太大,并且可能会耗尽内存。我们有好的替代方法吗。您可以通过一次只读取一个缓冲区来比较两个InputStream对象的内容。当您从每个流中“用完”时,您需要读取数据,注意当您调用read时,您可能不会真正读取一个完整的缓冲区 如果来自缓冲区的每个逐字节比较相等,并且流同时耗尽数据,则两个流相等。我怀疑代码可能有点复杂,但不应该

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


我们尝试过按字节[]数组进行比较(Apache使用了HTTPRequestBuilder),但问题是文件可能太大,并且可能会耗尽内存。我们有好的替代方法吗。

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

如果来自缓冲区的每个逐字节比较相等,并且流同时耗尽数据,则两个流相等。我怀疑代码可能有点复杂,但不应该太糟糕

事实上,对于更简单的代码,如果将每个
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;
        }
    }
}

谢谢Jon,但是如果假设“InputStream x”来自http调用,我们是否有失去连接或其他任何东西的风险?@Ahmad:连接总是会中断的,当然。。。你会得到一个例外。我看不出你怎么能避免这种情况。@Jon…那是我的担心Jon..我想如果我们把整个fle放在字节数组中,风险将是最低的n这就是我正在做的..你想比较这些文件只是为了看看它们是否相等还是得到它们之间的实际差异?