任何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