我无法找到如何将特定文件的内容与网站内容进行比较。
这是我用来检查的代码,如果它等于:
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。
答案 0 :(得分:1)
您不必要地将字节按摩到字符并返回,从而丢失原始字节中包含的信息。通常,当您有兴趣在每个字符的基础上读取或操作字节时,您应该只将字节转换为字符和您完全理解字符编码的工作方式。这似乎都不是这种情况。然后,您应该只是读取和写入原始和未修改的字节,而不是将它们转换为字符。
要从InputStream
读取URL
到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 IO和Google 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上它不会。但无论哪种情况,您都应该指定预期的编码。