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

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

但是:我需要将我的线条与换行符粘在一起,如果原始文件没有我的平台的“正确”换行符(Linux上的DOS文件,反之亦然),该怎么办? 我想我可以在流中稍微阅读一下,看看我找到了什么样的行结尾,即使那真是太烂了。

但是:假设我的输入文件没有尾随换行符。 我想保留它们的样子。 现在我需要在阅读每一行之前先查看下一行结尾。 在这一点上,我为什么要使用一个给我readLine()的类呢?

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

这是一个按char读取char的实现,直到找到一个行终止符。 传入的阅读器必须支持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()); } 

更新:

但是:我需要将我的线条与换行符粘在一起,如果原始文件没有我的平台的“正确”换行符(Linux上的DOS文件,反之亦然),该怎么办? 我想我可以在流中稍微阅读一下,看看我找到了什么样的行结尾,即使那真是太烂了。

您可以使用指定的字符集创建BufferedReader。 因此,如果文件很古怪,则必须提供文件的字符集。 Files.newBufferedReader(Path p,Charset cs)

是否有一个库(甚至更好的核心Java7类!)只是让我调用类似于readLine()的方法,它从流中返回一行文本,EOL字符是否完整?

如果你要阅读一个文件,你必须知道它是什么字符集。 如果您知道它是什么字符集,那么您不需要EOL字符“完整”,因为您可以自己添加它。


来自BufferedReader.readLine :

读一行文字。 一条线被认为是由换行符(’\ n’),回车符(’\ r’)或回车符中的任何一个终止,后面紧跟换行符。

返回:包含行内容的String,不包括任何行终止字符;如果已到达流末尾,则返回null

因此BufferedReader.readLine不返回任何行终止字符。 如果要保留这些字符,可以使用read方法。

 int size = 1000; // size of file BufferedReader br = new BufferedReader(new FileReader("file.txt")); char[] buf = new char[size]; br.read(buf, 0, size); 

这只是一个简单的例子,但如果文件有行终止,那么它将显示在缓冲区中。

您应该使用StreamTokenizer来更详细地控制输入操作。

http://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html