如何在一个哈希映射中读取两个大文本文件

时间:2018-06-18 03:01:40

标签: java file data-structures lambda time-complexity

我有两个文本文件,如

     file1. txt                file2.txt

  http://example.com       http://example.com
  http://example.com       http://example.com

我想逐行阅读这两个文件并比较两者的输出。 与file1的line1输出一样,file2的line1输出

那么,如果他们有数百万行,我们怎样才能以有效的方式阅读这两个文件。

我们可以使用java lambda表达式吗?

3 个答案:

答案 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
    }
}

上面的代码中有一些“调整”:

  1. 如果网址相同,则无需进行比较
  2. 如果或其他网址没有“打开”,那么就不应该比较它们
  3. 如果内容长度不同,您可以跳过比较
  4. 如果文件不相同,您可能只需要阅读部分文件。
  5. 您也可以通过并行进行一些比较来获得加速。风险在于您将淹没您的网络或远程服务器,或受到速率限制或被远程服务器阻止。

      

    那么,如果他们有数百万行,我们怎样才能以有效的方式阅读这两个文件。

    如果您确实需要比较文档,需要花费很长时间来比较数以百万计的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

这样你只需要随时在内存中保留两个响应。文件中有多少响应并不重要。