-1

我不知道如何将特定文件的内容与网站的内容进行比较。

这是我用来检查的代码,如果它等于:

 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";

获取文件():

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

您不必要地将字节转换为字符并返回,从而丢失原始字节中包含的信息。通常,只有当您对基于每个字符读取或操作字节感兴趣并且您完全了解字符编码的工作原理时,您才应该将字节转换为字符。这些似乎都不是这里的情况。然后,您应该只是读取和写入原始和未修改的字节,而不是将它们转换为字符。

要将InputStreamfrom读URL入 a byte[](而不是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[]并想将其与另一个进行比较byte[],那么您应该只使用Arrays#equals()而不将它们按摩到Strings:

Arrays.equals(contentFromURL, contentFromFile);

就这样。无需使用您甚至尚未确认 HTTP 响应确实以编码编码的字符编码来显式读取它,也无需吞下所有换行符并用固定的换行符替换它们您甚至还没有确认 HTTP 响应确实使用作为换行符。

于 2013-09-04T16:37:33.723 回答
0

如果内容真正匹配“test.txt”也应该是 UTF-8,你应该阅读它

new String(Files.readAllBytes(Paths.get(filePath)), "UTF-8")

在 Linux 系统上可能没有它可以工作,但在 Windows 上它不会。但无论哪种情况,您都应该指定预期的编码。

于 2013-09-04T15:31:14.880 回答