Java将文本文件读入流并将其拆分

时间:2018-07-18 13:48:26

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

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

让我的文本文件看起来像这样

div

现在我想要一个看起来像这样的数组或arraylist

; 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);

使用函数.map(string-> list.split(“”)),我会收到此错误G40 K88 F32 H38 B55 H33 K34 BLA77

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

3 个答案:

答案 0 :(得分:1)

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

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

此lambda会创建Stream<String>,但如果我们将其与map一起使用,例如

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

我们将得到Stream<Stream<String>>。这不是我们想要的,因为我们不想“迭代”流,而是要“迭代”其元素。因此,我们想“展平”此结构以获得Stream<String>

这可以通过

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

答案 1 :(得分:1)

这个怎么样?

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上有很多很好的例子。

答案 2 :(得分:1)

对于一站式解决方案,请尝试:

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