【问题标题】:How to process stream of streams?如何处理流的流?
【发布时间】:2014-05-08 09:55:32
【问题描述】:

考虑我想打印文件列表的行,仅使用 Java 8 流 API。我该怎么写呢?

这不是我的真实案例,只是一个非常简化的形式。

File[] files;
Arrays.stream(files). // what now?

我曾想过将其从 File 映射到 Stream<String>,但后来卡住了。

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:
    public class AllFilesLines {
      public static void main(String[] args) {
          File[] files = …
    
          Arrays.stream(files).flatMap(AllFilesLines::lines)
                .forEach(System.out::println);
      }
      static Stream<String> lines(File f) {
          try { return Files.lines(f.toPath()); }
          catch (IOException e) { throw new UncheckedIOException(e); }
      }
    }
    

    【讨论】:

      【解决方案2】:

      你可以这样做。

      package de.lhorn.so;
      
      import java.io.BufferedReader;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.io.Reader;
      import java.util.Arrays;
      
      public class SOPlayground {
      
          public static void main(String[] args) throws Exception {
              File[] files = {new File("/tmp/1.txt"), new File("/tmp/2.txt")};
      
              Arrays.stream(files).forEach(f -> { // Stream of File
                  try (InputStream fis = new FileInputStream(f);
                          Reader isr = new InputStreamReader(fis);
                          BufferedReader reader = new BufferedReader(isr)) {
                      reader.lines().forEach(line -> { // Stream of String
                          System.out.println(line);
                      });
                  } catch (IOException ex) {
                      System.err.println(ex);
                  }
              });
          }
      }
      

      编辑:使用Files

      package de.lhorn.so;
      
      import java.io.File;
      import java.io.IOException;
      import java.nio.file.Files;
      import java.util.Arrays;
      
      public class SOPlayground {
      
          public static void main(String[] args) throws Exception {
              File[] files = {new File("/tmp/1.txt"), new File("/tmp/2.txt")};
      
              Arrays.stream(files).forEach(f -> {
                  try {
                      Files.lines(f.toPath()).forEach(System.out::println);
                  } catch (IOException ex) {
                      System.err.println(ex);
                  }
              });
          }
      }
      

      【讨论】:

        【解决方案3】:

        您也可以使用Files.lines

        默认情况下,它认为文件中的字符采用 UTF-8 编码,但您可以根据需要指定 Charset

        File[] files = {new File("file1.txt"), new File("file2.txt")};
        for(File f : files){
            Files.lines(f.toPath()).forEach(System.out::println);
        }
        

        【讨论】:

        • Files.lines 抛出一个IOException。你会怎么处理?
        • @Tichodromamuraria Surround Files.line.. 使用 try/catch 或添加 throw 声明。
        猜你喜欢
        • 2013-11-09
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 2021-05-25
        • 2023-04-10
        • 1970-01-01
        • 2011-04-20
        相关资源
        最近更新 更多