使用BufferedReader读取多个文件

7
我希望使用一个单一的BufferedReader对象读取两个或更多文件中的文本。
这是我在代码中的实现方法。
Charset charset = Charset.forName("UTF-8");
Path p1 = Paths.get("sum1.csv");

List<String> list = new ArrayList<String>();
BufferedReader reader = Files.newBufferedReader(p1, charset);
try {
    String line;
    while((line = reader.readLine()) != null && !line.isEmpty()){
        list.add(line);
    }
} catch (IOException e) {
    System.err.format("IOException: %s%n", e);
    reader.close();
}

Path p2 = Paths.get("sum2.csv");
reader = Files.newBufferedReader(p2, charset);
try {
    String line;
    while((line = reader.readLine()) != null && !line.isEmpty()){
        list.add(line);
    }
} catch (IOException e) {
    System.err.format("IOException: %s%n", e);
    reader.close();
}

代码已经编译并成功运行。

处理此问题的标准方法是什么?是否可以使用单个 BufferedReader 读取两个或多个文件?

2个回答

6
Charset charset = Charset.forName("UTF-8");
List<String> list = new ArrayList<String>();
try(
  FileInputStream is1=new FileInputStream("sum1.csv");
  FileInputStream is2=new FileInputStream("sum2.csv");
  SequenceInputStream is=new SequenceInputStream(is1, is2);
  BufferedReader reader=new BufferedReader(new InputStreamReader(is, charset));)
{
  try {
      String line;
      while((line = reader.readLine()) != null && !line.isEmpty()){
          list.add(line);
      }
  } catch (IOException e) {
      System.err.format("IOException: %s%n", e);
  }
}

顺便问一下,你是不是指的是

String line;
while((line = reader.readLine()) != null)
  if(!line.isEmpty()) list.add(line);

针对你的内部循环?你的代码会在遇到第一个空行时停止,我建议使用的替代方案跳过空行。但是我只能猜测你实际的意图。


我有一个类似的情况。只是我有sum1到sumN,其中N是一个非常大的数字。我如何一次读取它们所有?我可以做类似于sum*的事情吗? - tanmayghosh2507
1
@tanmay2507:SequenceInputStream有一个接受Enumeration的构造函数。如果你在使用它时遇到困难,请开一个新问题。 - Holger
唉,我希望有一种通过lambda传递它的方法。 - Sridhar Sarnobat
@tanmayghosh2507可能正在寻找Collections.enumeration(List.of(is1, is2)) - Sridhar Sarnobat
1
@SridharSarnobat 或许这个答案会有所帮助。它的StreamInputStream接受一个Stream,你可以用lambda表达式填充它。 - Holger

1
在上面的代码中,您确实创建了一个新的 BufferedReader 来从第二个文件中读取。您所做的是完全可以的,尽管将重复的代码放入一个方法中,该方法需要文件名和字符串列表作为参数可能更有意义。
您有一个小错误 - 如果任何一个文件中间有空行,您的程序在到达它时停止读取。我不确定这是否是您真正想要的。

似乎没有避免创建新的BufferedReader从第二个文件中读取的方法。你认为呢? - Jane Foster
我确实不知道有任何避免它的方法。但我也不知道为什么你想要避免它。使用新的 BufferedReader 就可以了。 - Dawood ibn Kareem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接