一个文件等于网站的内容?

时间:2013-09-04 15:20:05

标签: java file java-io

我无法找到如何将特定文件的内容与网站内容进行比较。

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

 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。

2 个答案:

答案 0 :(得分: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[],并希望将其与其他byte[]进行比较,那么您应该使用Arrays#equals()而不是将其按到String s:< / p>

Arrays.equals(contentFromURL, contentFromFile);

这就是全部。没有必要使用字符编码显式读取它,您甚至没有确认HTTP响应是否真的已在 编码中编码,并且也不需要吞下所有换行符用一个固定的替换它们,你甚至没有确认HTTP响应是否真的使用那个作为换行符。

答案 1 :(得分:0)

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

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

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