在Java中保留EOL字符的同时解析和更改文件

时间:2010-10-15 19:42:13

标签: java file-io

一个很长的问题:)

以下是我通常的做法:

StringBuilder b = new StringBuilder();
BufferedReader r = new BufferedReader(new StringReader(s));
while ((String line = r.readLine()) != null)
    b.append(doSomethingToTheString(s) + "\n");

但是,这会使用换行符替换文件中的所有新换行符,如果没有换行符,则会在末尾添加一个。我想要的是保留EOL字符,即使它像这样混淆:

Hello\r\n
World\n
This is\r
Messed up

最优雅/最有效的方式是什么?

3 个答案:

答案 0 :(得分:4)

这不是一个很长的问题:)

基本上,您无法在BufferedReader.readLine()处执行任何操作。它总是删除行终止符,你无能为力。

但是,您可以查看readLine()中的代码(假设许可证与您编写代码的任何上下文兼容)并且基本上自己执行相同的任务,但保留行终止符。

答案 1 :(得分:0)

如果您要保留行终止符,请使用InputStream而不是Reader。您需要实现自己的readLine()函数,该函数查找标准换行符/对并将其保留在返回值中。

如果您尝试输出类似于仅具有主机操作系统的默认行结尾的输入的文件,请使用Writer或附加使用System.getProperty("line.separator")找到的行终止符。

答案 2 :(得分:0)

以下是解决方案的草图,因为我没有时间详细说明完整的代码段。

  1. 您需要一个类(比如WeirdLine)来表示每一行,基本上是行内容的String字段,以及行终止符的byte []字段。

    class WeirdLine { final String line; final byte[] term; }

  2. 您需要一个类(例如WeirdLineReader)来包装InputStream。它可以公开方法readWeirdLine(),当流为空时返回WeirdLinenull的实例

  3. WeirdLineReader需要维护一个内部字节缓冲区。调用readWeirdLine()时,将字节铲入缓冲区(InputStream.read()),根据需要增长,直到

    一个。 read()返回-1,文件结束。 readWeirdLine()返回一个带有null终结符字段的实例,以及String获得的new String(buffer[])的全部内容。

    findTerminator()方法扫描以查找字节序列\ r \ n或\ n或您想要处理的其他终结符。此方法还应返回WeirdLine或null,如果是,则应将内部缓冲区清除/截断。

    ℃。内部缓冲区只是空的,返回null

  4. 然后,您需要编写相应的机制来将WeirdLine写回,保留终止。

    对于内部缓冲区,这可能最容易使用ByteBuffer而不是原始byte[]

    如果这听起来令人生畏,可能会将代码调整为BufferedReader