Java 流和多行记录

标签 java text stream

我正在尝试使用Java流读取具有多行记录的文本文件

我有一个由记录组成的文本文件,每条记录位于 1 行或多行,由空行分隔。我正在尝试使用 Java 流生成记录,但遇到问题

import java.util.*;
import java.io.*;
import java.nio.file.*;
import java.util.stream.*;

public class Jstream {
    public static void main(String[] args) {
        new Jstream().run(args);
    }

    private void run(String[] args) {
        String input = (args.length == 0) ? "test.in" : args[0];

        try 
        {
            Path path = Paths.get(input);
            FileReader reader = new FileReader(input);
            Scanner scanner = new Scanner(reader).useDelimiter("^\\s*$");

            Stream<String> streamOfRecords = StreamSupport.stream(
                    Spliterators.spliteratorUnknownSize(scanner,
                            Spliterator.ORDERED), false);

            List<String> result =
                streamOfRecords
                    .map(l -> l.replaceAll("\n", " "))
                    .map(l -> l.replaceAll("\r", " "))
                    .map(String::trim)
                    .collect(Collectors.toList());

            for(String s : result)
                System.out.println("-> " + s);

        } catch(Exception e)
        {
            System.out.println(e.toString());
        }
    }
}

输入可以是

this is
a
single record

here is the next record followed by a line with just a space

finally
our
last
record

我想看到类似的东西

-> this is a single record
-> here is the next record followed by a line with just a space
-> finally our last record

我不在乎记录中的单词之间有多少个空格,只要至少有 1 个即可。我确实让它适用于 useDelimiter("\n\n"),但如果空行有一个失败的空间。

最佳答案

您需要在分隔符正则表达式中设置多行模式。如果没有它, ^$ 仅检查完整文本内容的开头和结尾,而不是每行的开头和结尾。 您可以在正则表达式语句开头使用 (?m)-flag 设置多行模式。

Scanner scanner = new Scanner(reader).useDelimiter("(?m)^\\s*$");

关于Java 流和多行记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56655536/

相关文章:

java - byte[] 到 bufferedImage 转换给出 null

java - 如何保护hibernate中的列不被读取

Linux 上文本文件的 SQL 查询引擎?

java - 将字节流转换为字节数组,无需额外空间

java - Android:如何显示带有回调的相机预览?

JavaFX16 警告 : Unsupported JavaFX configuration: classes were loaded from 'unnamed module @***'

linux - awk 和复杂 find 的输出错误

text - Applescript,将行读取为变量

c++ - Live555:基于 "testOnDemandRTSPServer"的X264码流直播源码

http - 使用 HTTP Post 从客户端流式传输数据