2017-04-14 63 views
1

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

我想读的每个文件的1号线,然后对每个文件等行号2 ..

我该怎么办呢?

我有一个BufferedReader阵列,如:

BufferedReader[] readers = new BufferedReader[x]; 
+0

你可以使用5个线程。但是如果你这样做是为了加快速度,所有5个文件应该放在不同的驱动器上,否则它可能会变得更慢而不是更快。 – SpiderPig

+0

我不想使用线程..是不是可以用for和while循环做到这一点? – iAmoric

+0

为什么你需要同时阅读它们?你需要多快读取它们? – SpiderPig

回答

3

你可以使用一个循环迭代,而你从读者的新线。
在循环内部,添加一个嵌套循环遍历读取器。这样,您可以读取匹配到每个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); 
     } 
    } 

} 
+0

但是,如果我不知道线路的数量,我该如何知道何时停止? (在你的例子中为10) – iAmoric

+0

你可以在'readLine()'之后检查'line'的值。我更新了代码。 – davidxxx

+0

是的,没关系。我会试试这个! – iAmoric

1

如果我理解正确的话,你有一个阵列设置,为每个需要读取文件中的一个缓冲的读者。如果要读取每个文件的第一行,每个文件的第二行等,则需要在到达最长文件的最后一行时停止。

您可以通过查找每个文件中的行数并保存最大值来获取此值。 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(); 
} 
1

我使用ArrayList,而不是一个数组。

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

是的,这个解决方案看起来不错。我会尝试 ! – iAmoric

+1

如果使用增强for循环遍历它,则不应修改集合。改用'Iterator#remove'。 – Pshemo

1

你可以使用流: while(Arrays.stream(readers).filter(br -> br.ready()).count()>0) Arrays.stream(readers).map(br -> br.readLine()).toArray()