我有两个文本文件,如
file1. txt file2.txt
http://example.com http://example.com
http://example.com http://example.com
我想逐行阅读这两个文件并比较两者的输出。 与file1的line1输出一样,file2的line1输出
那么,如果他们有数百万行,我们怎样才能以有效的方式阅读这两个文件。
我们可以使用java lambda表达式吗?
答案 0 :(得分:3)
private static <R> List<R> compare(Path path1, Path path2, BiFunction<String, String, R> compare) throws IOException
{
List<R> list = new ArrayList<>();
try (Stream<String> s1 = Files.lines(path1);
Stream<String> s2 = Files.lines(path2))
{
Iterator<String> itr1 = s1.iterator();
Iterator<String> itr2 = s2.iterator();
//compare only till both the files have some entry
while (itr1.hasNext() && itr2.hasNext())
{
list.add(compare.apply(itr1.next(), itr2.next()));
}
}
return list;
}
答案 1 :(得分:2)
没有特别有效的方法。你能做到最好:
// pseudo-code
file1 = open(...)
file2 = open(...)
while (file1 not at EOF) {
url1 = file1.readLine()
url2 = file2.readLine()
if (url1 != url2) {
connection1 = open(url1)
connection2 = open(url2)
// deal with "error" responses
if (connnection1.contentLength != connection2.contentLength) {
// not same
} else {
// compare bytes for connection output streams)
}
} else {
// same
}
}
上面的代码中有一些“调整”:
您也可以通过并行进行一些比较来获得加速。风险在于您将淹没您的网络或远程服务器,或受到速率限制或被远程服务器阻止。
那么,如果他们有数百万行,我们怎样才能以有效的方式阅读这两个文件。
如果您确实需要比较文档,需要花费很长时间来比较数以百万计的URL。限制因素将是网络(带宽,延迟,拥塞等)或远程服务器的性能。
我们可以使用java lambda表达式吗?
它不会对表现产生明显的影响。
答案 2 :(得分:1)
你问的问题听起来很简单。一般的想法是:
open file1
open file2
while not (end of file1 or end of file2)
read response from file1
read response from file2
compare response1 and response2
end while
close file1
close file2
这样你只需要随时在内存中保留两个响应。文件中有多少响应并不重要。