【问题标题】:Java Read text file into a stream and split it [duplicate]Java将文本文件读入流并将其拆分[重复]
【发布时间】:2018-07-18 13:48:25
【问题描述】:

我想读取带有流的文本文件并将其保存到数组中。

假设我的文本文件看起来像这样

; Kommentar G40 K88 F32 H38 ; noch ein Kommentar B55 H33 K34 Bla77

现在我想要一个像这样的数组或数组列表

G40
K88
F32
H38
B55
H33
K34
Bla77

所以我想删除以“;”开头的行并在空格后拆分其他所有内容。

我是这样尝试的:

 List<String> list = new ArrayList<>();

    try (Stream<String> stream = Files.lines(Paths.get(path))) {


        list = stream
                .filter(line -> !line.startsWith(";"))
        //  .map(string -> list.split(" "))
                .map(String::toUpperCase)
                .collect(Collectors.toList());

    } catch (IOException e) {
        e.printStackTrace();
    }

    list.forEach(System.out::println);

打印:

G40 K88 F32
H38
B55
H33 K34 BLA77

使用函数 .map(string -> list.split(" ")) 我会得到这个错误The method split(String) is undefined for the type List&lt;String&gt;

我是 Java 新手,经过数小时的搜索,我找不到答案。希望这里有人可以给我一个提示。谢谢

【问题讨论】:

    标签: java file split java-8 java-stream


    【解决方案1】:

    要分割线并创建包含其元素的流,请使用

    line -> Stream.of(line.split("\\s+"))
    //OR 
    //line -> Arrays.stream(line.split("\\s+"))
    

    这个 lambda 创建 Stream&lt;String&gt; 但如果我们将它与 map 一起使用,就像

    map(line -> Stream.of(line.split("\\s+")))
    

    我们会收到Stream&lt;Stream&lt;String&gt;&gt;。这不是我们想要的,因为我们不想“迭代”流,而是“迭代”它的元素。所以我们想把这个结构“扁平化”得到Stream&lt;String&gt;

    这可以通过

    来实现
    flatMap(line -> Stream.of(line.split("\\s+")))
    

    【讨论】:

      【解决方案2】:

      这个怎么样?

      list = stream
           .filter(line -> !line.startsWith(";"))           // filters out comments
           .map(String::toUpperCase)                        // uppercase
           .flatMap(string -> Stream.of(string.split(" "))) // flattens the split array to the 
                                                            // Stream elements and adds to the 
                                                            // current Stream
           .collect(Collectors.toList());                   // as List
      

      Stream::flatMap 返回一个流,其中包含用映射流的内容替换该流的每个元素的结果,该映射流的内容是通过将提供的映射函数应用于每个元素(来自文档)而生成的。

      Baeldung's webpage 上有非常好的示例。

      【讨论】:

        【解决方案3】:

        对于多合一的解决方案,请尝试:

        Files.lines(Paths.get("your/file/path"))
             .filter(l -> !l.startsWith(";"))
             .flatMap(l -> Arrays.stream(l.split("\n")))
             .forEach(System.out::println);
        

        【讨论】:

          猜你喜欢
          • 2013-07-23
          • 2016-04-11
          • 1970-01-01
          • 2011-05-12
          • 1970-01-01
          • 1970-01-01
          • 2014-05-02
          • 1970-01-01
          • 2013-05-31
          相关资源
          最近更新 更多