【问题标题】:Reading multiple files using BufferedReader使用 BufferedReader 读取多个文件
【发布时间】:2014-03-08 04:30:37
【问题描述】:

我想使用单个 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 读取两个或多个文件?

【问题讨论】:

    标签: java io bufferedreader


    【解决方案1】:

    在上面的代码中,您确实创建了一个新的 BufferedReader 来读取第二个文件。您所做的一切都很好,尽管将重复的代码放入一个将文件名和字符串列表作为参数的方法中是有意义的。

    您遇到了一个小故障 - 如果您的两个文件中间有一个空行,您的程序会在到达该行时停止读取。我不确定这是否真的是你想要的。

    【讨论】:

    • 似乎没有办法避免创建一个新的 BufferedReader 来读取第二个文件。你怎么看?
    • 我当然不知道有什么方法可以避免它。但我也不知道你为什么要避免它。拥有一个新的 BufferedReader 就可以了。
    【解决方案2】:
    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* 的事情吗?
    • @tanmay2507: SequenceInputStream 有一个constructor that accepts an Enumeration。如果您难以在此基础上构建解决方案,请提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2013-04-12
    • 2017-08-12
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多