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

dap*_*hez 22 java readline bufferedreader

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

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

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

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

Ste*_*n C 12

最简单的方法是实现自己的有界线读取器.

或者更简单,重复使用代码这个BoundedBufferedReader.

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

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

  • 或者您可以窃取它:http://code.google.com/p/owasp-esapi-java/issues/attachmentText?id = 183&aid = 7134623167843514645&name = B.BoundBufferedReader.java (3认同)

Kev*_*ack 11

另一个选择是Apache Commons的BoundedInputStream:

InputStream bounded = new BoundedInputStream(is, MAX_BYTE_COUNT);
BufferedReader reader = new BufferedReader(new InputStreamReader(bounded));
String line = reader.readLine();
Run Code Online (Sandbox Code Playgroud)

  • @Renan是的,在上面的例子中,假设MAX_LINE_SIZE是以字节为单位定义的.在OP描述的场景中,输入数据是未知的并且可能是恶意的,因此您无法真正假设编码.因此,基于字节数的限制似乎最好.但是,如果您的用例具有已知的多字节编码的可信数据,那么您可以相应地进行调整.我将编辑变量名称更明确;) (2认同)