快速比较输入流的方法

2022-09-01 13:31:16

我有一个问题,我需要快速比较两个输入流。

今天我有一个这样的函数:

private boolean isEqual(InputStream i1, InputStream i2) throws IOException {

    try {
        // do the compare
        while (true) {
            int fr = i1.read();
            int tr = i2.read();

            if (fr != tr)
                return false;

            if (fr == -1)
                return true;
        }

    } finally {
        if (i1 != null)
            i1.close();
        if (i2 != null)
            i2.close();
    }
}

但速度真的很慢。我想使用缓冲读取,但还没有想出一个好方法。

一些额外的东西使它更难:

  • 我不想将其中一个输入流读入内存(整个输入流)
  • 我不想使用第三方库

我需要一个实用的解决方案 - 代码!:)


答案 1

到目前为止,我最喜欢的是使用Apache Commons IO库中的帮助器类:org.apache.commons.io.IOUtils

IOUtils.contentEquals( is1, is2 );

答案 2

像这样的东西可能会做:

private static boolean isEqual(InputStream i1, InputStream i2)
        throws IOException {

    ReadableByteChannel ch1 = Channels.newChannel(i1);
    ReadableByteChannel ch2 = Channels.newChannel(i2);

    ByteBuffer buf1 = ByteBuffer.allocateDirect(1024);
    ByteBuffer buf2 = ByteBuffer.allocateDirect(1024);

    try {
        while (true) {

            int n1 = ch1.read(buf1);
            int n2 = ch2.read(buf2);

            if (n1 == -1 || n2 == -1) return n1 == n2;

            buf1.flip();
            buf2.flip();

            for (int i = 0; i < Math.min(n1, n2); i++)
                if (buf1.get() != buf2.get())
                    return false;

            buf1.compact();
            buf2.compact();
        }

    } finally {
        if (i1 != null) i1.close();
        if (i2 != null) i2.close();
    }
}