是否有任何 Java 流输入库保留行结束字符?

Cod*_*rer 3 java inputstream line-endings bufferedreader

我想一次一行地遍历一个文本文件,对内容进行操作,并将结果流式传输到一个单独的文件中。的教科书案例BufferedReader.readLine()

但是:我需要用换行符将我的行粘在一起,如果原始文件没有适用于我的平台的“正确”换行符(Linux 上的 DOS 文件,反之亦然)怎么办?我想我可以在流中提前阅读一下,看看我找到了什么样的行尾,即使那真的很糟糕。

但是:假设我的输入文件没有尾随换行符。我想让事情保持原样。现在我需要在阅读每一行之前先看下一行结尾。在这一点上,为什么我要使用一个完全给我的readLine()课程?

这似乎应该是一个已解决的问题。是否有一个库(或者甚至更好的核心 Java7 类!)可以让我调用一个类似于readLine()从流中返回一行文本的方法,并且EOL 字符完好无损?

Jes*_*man 6

这是一个逐个字符读取字符直到找到行终止符的实现。传入的 reader 必须支持mark(),因此如果您的不支持,请将其包装在BufferedReader.

public static String readLineWithTerm(Reader reader) throws IOException {
    if (! reader.markSupported()) {
        throw new IllegalArgumentException("reader must support mark()");
    }

    int code;
    StringBuilder line = new StringBuilder();

    while ((code = reader.read()) != -1) {
        char ch = (char) code;

        line.append(ch);

        if (ch == '\n') {
            break;
        } else if (ch == '\r') {
            reader.mark(1);
            ch = (char) reader.read();

            if (ch == '\n') {
                line.append(ch);
            } else {
                reader.reset();
            }

            break;
        }
    }

    return (line.length() == 0 ? null : line.toString());
}
Run Code Online (Sandbox Code Playgroud)