-1

特定のファイルのコンテンツを Web サイトのコンテンツと比較する方法がわかりませんでした。

これは、等しいかどうかを確認するために使用したコードです。

 private static boolean equals() {
    try {
        return new String(Files.readAllBytes(Paths.get(filePath))).equals(getFile());
    } catch (Exception e) {
        return false;
    }
}

ファイルパス:

private static final String filePath = "test.txt";

getFile():

private static String getFile() {
    try {
        URL pageURL = new URL(simpleurl);
        URLConnection uc = pageURL.openConnection();
        StringBuilder text = new StringBuilder();
        try (Scanner scanner = new Scanner(uc.getInputStream(), "UTF-8")) {
            while (scanner.hasNextLine()) {
                text.append(scanner.nextLine()).append("\n");
            }
        }
        return text.toString();
    } catch (Exception ex) {
        return null;
    }
}

メソッド #equals() は、コンテンツがファイルと一致している間、常に false を返します。

4

2 に答える 2

1

バイトを不必要に文字に戻したり戻したりすることで、元のバイトに含まれる情報が失われます。通常、文字単位でバイトを読み取ったり操作したりすることに関心があり、文字エンコーディングがどのように機能するかを完全に理解している場合にのみ、バイトを文字に変換する必要があります。ここではどちらも当てはまらないようです。次に、文字に変換するのではなく、未加工の変更されていないバイトを読み書きするだけです。

InputStreamからURLbyte[]( の代わりに) に読み込むにStringは、次のいずれかの方法があります。

ByteArrayOutputStream output = new ByteArrayOutputStream();

try (InputStream input = url.openStream()) {
    byte[] buffer = new byte[10240];
    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length));
    }
}

byte[] contentFromURL = output.toByteArray();

( Apache Commons IOGoogle Guavaには、このための oneliner メソッドがあります)

をファイルに保存する場合byte[]は、次のようにするだけで、それらを文字に変換する必要がないことに注意してくださいnew String()

Files.write(path, contentFromURL);

またInputStream、仲介者を必要とせずにすぐにファイルに保存するbyte[]場合は、最初にこれを行う必要があることに注意してください。

try (InputStream input = url.openStream()) {
    Files.copy(input, path);
}

いずれにせよ、最初に取得したものとまったく同じバイトを含むファイルになります。コードに基づいて、byte[]次のようにそれを取得できることが既にわかっています。

byte[] contentFromFile = Files.readAllBytes(path);

コンテンツがbyte[]あり、それを別の と比較したい場合は、それらをsにマッサージせずbyte[]に使用する必要があります。Arrays#equals()String

Arrays.equals(contentFromURL, contentFromFile);

それで全部です。HTTP 応答が実際にそのエンコーディングでエンコードされていることを確認していない文字エンコーディングを使用して明示的に読み取る必要はありません。また、すべての改行を飲み込んで、 HTTP 応答が実際にそれを改行文字として使用していることさえ確認していません。

于 2013-09-04T16:37:33.723 に答える