Java 中 BufferedReader.readLine() 的最大行长?

2022-09-01 19:02:58

我使用 BufferedReader 的方法从套接字中读取文本行。readLine()

没有明显的方法来限制行读取的长度。

我担心数据源可以(恶意或错误地)写入大量数据而没有任何换行符,这将导致BufferedReader分配无限量的内存。

有没有办法避免这种情况?还是我必须实现自己的有界版本?readLine()


答案 1

执行此操作的最简单方法是实现您自己的有界行读取器。

或者更简单,重用BoundedBufferedReader中的代码。

实际上,编写与标准方法相同的编码并非易事。正确处理3种线路终结器需要一些非常仔细的编码。将上述链接的不同方法与缓冲阅读器的Sun版本Apache Harmony版本进行比较是很有趣的。readLine()

注意:我并不完全相信有界版本或Apache版本是100%正确的。有界版本假定底层流支持标记和重置,这当然并不总是正确的。Apache 版本如果将 CR 视为缓冲区中的最后一个字符,则它似乎会预读一个字符。在读取用户键入的输入时,这将在 MacOS 上中断。Sun 版本通过设置一个标志来处理此问题,以使在下一个操作中跳过 CR 之后的可能 LF;即没有虚假的预读。read...


答案 2

另一个选项是Apache Commons的BoundedInputStream

InputStream bounded = new BoundedInputStream(is, MAX_BYTE_COUNT);
BufferedReader reader = new BufferedReader(new InputStreamReader(bounded));
String line = reader.readLine();

推荐