如何以编程方式比较两个java.io.File

时间:2016-07-22 13:06:36

标签: java android

有没有办法比较Android中的两个文件?

  

例如:我在同一文件夹下有两个文件,它们是相同的。   它们相同(也在尺寸上),但它们的名字就像   myFileA.pdfmyFileB.pdf。那我该如何识别它们呢?   是否相同。

我曾尝试过什么:

  • compareTo() 方法:尝试myFileA.compare(myFileB),但这会给出一些奇怪的值,如-1,-2等。我认为这些值是文件' PATH 依赖。
  • myFile.length() :但在一些罕见的情况下(非常罕见的情况),两个不同的文件可以具有相同的大小,所以我认为这不是一个合适的方式。
  

注意:我说文件位于相同的文件夹下,例如,它们可以是myFileA.pdf所在的任何位置   NewFolder1myFileB.pdf可以在NewFolder2

2 个答案:

答案 0 :(得分:2)

有些时候我写了一个实用程序来有效地比较两个流的内容:在找到第一个差异时停止比较。 以下是我认为可以自我解释的代码:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;

public class FileComparator implements Comparator<File> {

    @Override
    public int compare(File file1, File file2) {

        // one or both null
        if (file1 == file2) {
            return 0;
        } else if (file1 == null && file2 != null) {
            return -1;
        } else if (file1 != null && file2 == null) {
            return 1;
        }

        if (file1.isDirectory() || file2.isDirectory()) {
            throw new IllegalArgumentException("Unable to compare directory content");
        }

        // not same size
        if (file1.length() < file2.length()) {
            return -1;
        } else if (file1.length() > file2.length()) {
            return 1;
        }

        try {
            return compareContent(file1, file2);
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }

    }

    private int bufferSize(long fileLength) {
        int multiple = (int) (fileLength / 1024);
        if (multiple <= 1) {
            return 1024;
        } else if (multiple <= 8) {
            return 1024 * 2;
        } else if (multiple <= 16) {
            return 1024 * 4;
        } else if (multiple <= 32) {
            return 1024 * 8;
        } else if (multiple <= 64) {
            return 1024 * 16;
        } else {
            return 1024 * 64;
        }
    }

    private int compareContent(File file1, File file2) throws IOException {

        final int BUFFER_SIZE = bufferSize(file1.length());

        // check content
        try (BufferedInputStream is1 = new BufferedInputStream(new FileInputStream(file1), BUFFER_SIZE); BufferedInputStream is2 = new BufferedInputStream(new FileInputStream(file2), BUFFER_SIZE);) {

            byte[] b1 = new byte[BUFFER_SIZE];
            byte[] b2 = new byte[BUFFER_SIZE];

            int read1 = -1;
            int read2 = -1;
            int read = -1;

            do {
                read1 = is1.read(b1);
                read2 = is2.read(b2);

                if (read1 < read2) {
                    return -1;
                } else if (read1 > read2) {
                    return 1;
                } else {
                    // read1 is equals to read2
                    read = read1;
                }

                if (read >= 0) {
                    if (read != BUFFER_SIZE) {
                        // clear the buffer not filled from the read
                        Arrays.fill(b1, read, BUFFER_SIZE, (byte) 0);
                        Arrays.fill(b2, read, BUFFER_SIZE, (byte) 0);
                    }
                    // compare the content of the two buffers
                    if (!Arrays.equals(b1, b2)) {
                        return new String(b1).compareTo(new String(b2));
                    }
                }
            } while (read >= 0);

            // no difference found
            return 0;
        }
    }
}

答案 1 :(得分:0)

比较两个文件:

public static boolean compareFiles(File file1, File file2) {
        byte[] buffer1 = new byte[1024];
        byte[] buffer2 = new byte[1024];
        try {
            FileInputStream fileInputStream1 = new FileInputStream(file1);
            FileInputStream fileInputStream2 = new FileInputStream(file2);
            while (fileInputStream1.read(buffer1) != -1) {
                if (fileInputStream2.read(buffer2) != -1 && !Arrays.equals(buffer1, buffer2))
                    return false;
            }
            return true;
        } catch (Exception ignore) {
            return false;
        }
    }

当然,在此之前,您必须比较文件大小。只有匹配,才比较内容。