【问题标题】:Read several files at the same time Java [closed]同时读取多个文件Java [关闭]
【发布时间】:2017-09-11 02:53:11
【问题描述】:

我想在 Java 中同时读取多个文件。 例如,我有 5 个文件,每个文件有 50 行(但我无法提前知道)。

我想读取每个文件的第 1 行,然后读取每个文件的第 2 行,等等。

我该怎么做?

我有一个 BufferedReader 数组,例如:

BufferedReader[] readers = new BufferedReader[x]; 

【问题讨论】:

  • 你可以使用 5 个线程。但如果你这样做是为了加快速度,所有 5 个文件都应该在不同的驱动器上,否则它可能会更慢而不是更快。
  • 我不想使用线程。难道不能用 for 和 while 循环来做到这一点吗?
  • 为什么需要同时阅读它们?您需要以多快的速度阅读它们?
  • 用负责每个文件的读取器填充您的数组,然后遍历它们并让它们读取一行。重复直到没有更多的行要阅读。
  • @SpiderPig,我需要在同一行连接每个文件的信息。速度并不重要。

标签: java file-io bufferedreader filereader


【解决方案1】:

你可以使用流:

while(Arrays.stream(readers).filter(br -> br.ready()).count()>0)
    Arrays.stream(readers).map(br -> br.readLine()).toArray()

【讨论】:

    【解决方案2】:

    当您从读者那里获得新的一行时,您可以使用循环进行迭代。
    在循环内部,添加一个嵌套循环以遍历阅读器。这样就可以读取到每个BufferedReader的相同行号匹配的行了。

    这是一个想法:

    BufferedReader[] readers = new BufferedReader[5]; 
    readers[0] = new BufferedReader(new FileReader("...));
    ...
    readers[4] = new BufferedReader(new FileReader("...));
    
    
    boolean noMoreLine = false;
    while (!noMoreLine)       
    
       for (BufferedReader reader : readers){
            String line = reader.readLine();
            if (line == null){
               noMoreLine = true;
               System.out.println("no more line");
               break;
            }
            System.out.println("Line " + i + " = line);
           }
        }
    
    }
    

    【讨论】:

    • 但是如果我不知道行数,我怎么知道什么时候停止呢? (在您的示例中为 10)
    • 您在readLine() 之后检查line 值。我更新了代码。
    • 是的,没关系。我会试试这个!
    【解决方案3】:

    我会使用 ArrayList 而不是数组。

    ArrayList<BufferedReader> readers = new ArrayList<>();
    ...
    while(!readers.isEmpty()) {
      for(BufferedReader reader: readers) {
        String line = reader.readLine();
        if(line == null) {
          readers.remove(reader);
        } else {
          ...
        }
      }
    }
    

    【讨论】:

    • 是的,这个解决方案看起来不错。我会试试的!
    • 如果您使用增强的 for 循环对其进行迭代,则不应修改集合。请改用Iterator#remove
    【解决方案4】:

    如果我理解正确,您已经设置了一个数组,每个需要读取的文件都有一个缓冲读取器。如果要读取每个文件的第一行、每个文件的第二行等,则需要在到达最长文件的最后一行时停止。

    您可以通过查找每个文件中的行数并保存最大值来获取此值。 Number of lines in a file in Java 可能有用。

    然后,写一个for循环:

    for (int i = 0; i < longestFileLength; i++) {
        String fileLine1 = readers[1].readLine();
        String fileLine2 = readers[2].readLine();
        //...
        String fileLine99 = readers[99].readLine();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多