tại sao không chỉ đơn giản là quấn cả hai con suối ở đầu rất của phương pháp của bạn:
i1 = new BufferedInputStream(i1);
i2 = new BufferedInputStream(i2);
Ngoài ra, bạn chỉ đơn giản là có thể thử đọc cả suối vào một bộ đệm:
public static boolean equals(InputStream i1, InputStream i2, int buf) throws IOException {
try {
// do the compare
while (true) {
byte[] b1 = new byte[buf];
byte[] b2 = new byte[buf];
int length = i1.read(b1);
if (length == -1) {
return i2.read(b2, 0, 1) == -1;
}
try {
StreamUtils.readFully(i2, b2, 0, length);
} catch (EOFException e) {
// i2 is shorter than i1
return false;
}
if (!ArrayUtils.equals(b1, b2, 0, length)) {
return false;
}
}
} finally {
// simply close streams and ignore (log) exceptions
StreamUtils.close(i1, i2);
}
}
// StreamUtils.readFully(..)
public static void readFully(InputStream in, byte[] b, int off, int len) throws EOFException, IOException {
while (len > 0) {
int read = in.read(b, off, len);
if (read == -1) {
throw new EOFException();
}
off += read;
len -= read;
}
}
// ArrayUtils.equals(..)
public static boolean equals(byte[] a, byte[] a2, int off, int len) {
if (off < 0 || len < 0 || len > a.length - off || len > a2.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return true;
}
if (a == a2) {
return true;
}
if (a == null || a2 == null) {
return false;
}
for (int i = off; i < off + len; i++) {
if (a[i] != a2[i]) {
return false;
}
}
return true;
}
EDIT: Tôi đã sửa lỗi triển khai của mình ngay bây giờ. Đó là cách nó trông giống như không có DataInputStream hoặc NIO. Mã là available at GitHub hoặc từ Sonatype's OSS Snapshot Repository Maven:
<dependency>
<groupId>at.molindo</groupId>
<artifactId>molindo-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
tôi đừng nghĩ rằng bạn có thể so sánh bất cứ điều gì mà không cần đọc nó vào bộ nhớ. Bạn có thực sự có nghĩa là đọc * toàn bộ inputstream * vào bộ nhớ, có nghĩa là đọc một số byte cố định là ok? – Patrick
Tôi có nghĩa là đọc toàn bộ đầu vào vào bộ nhớ không phải là một tùy chọn – dacwe