从Java中的输入流中读取一行文本,保留行终止字符

Mik*_*ike 12 java inputstream line

我在Java中有这个代码:

InputStreamReader isr = new InputStreamReader(getInputStream());
BufferedReader ir = new BufferedReader(isr);
String line;
while ((line = ir.readLine()) != null) {
 //do stuff with "line"
}
Run Code Online (Sandbox Code Playgroud)

如果输入流包含以下内容:"hello \nhey\ryo\r \ngood-day",则每次迭代时都会跟随行变量:

  1. 你好
  2. 美好的一天

我想一次读一行,但我想保留行终止字符:

  1. 你好\n
  2. 哎\ r
  3. 哟\ r \n
  4. 美好的一天

我怎样才能做到这一点?有没有我可以使用的现成课程?

-

更新:

这是我正在尝试做的以及为什么我需要保持行尾字符(以及为什么EOL字符可能不同).

我正在阅读POST请求.它们由纯文本消息组成,其中行始终以\ r \n结尾(按标准规范).但是,POST请求可能包含二进制数据,这些数据可能包含看起来像Java Reader对象的终止字符的字节.

在我的示例中,正在上载图像.图像数据在一行上发送.但是,图像的二进制数据包含READER将其解释为"\n","\ r"或有时"\ r \n"的字节,如果这两个字节碰巧彼此相邻的话.

我必须一次读取一行的POST请求,因为它是如何工作的.我想,我可以阅读所有内容然后解析整个事情.但这并不高效,尤其是在上传大文件(比如说1024 MiB)的情况下.

pts*_*pts 4

如果你想读取 HTTP POST 请求,我强烈建议直接使用BufferedInputStream.read()(不是BufferedReader!)(不带readLine类似的中间抽象),手动注意所有细节,包括根据 HTTP RFC 处理 CR 和 LF。

这是我对您更具体的问题的回答(如何准确实现readLine)。这可能不是最快的解决方案,但它的时间复杂度是最佳的,并且它有效:

import java.io.BufferedReader;
import java.io.IOException;   
public class LineReader {   
  private int i = -2;
  private BufferedReader br;
  public OriginalLineReader(BufferedReader br) { this.br = br; }
  public String readLine() throws IOException {
    if (i == -2) i = br.read();
    if (i < 0) return null;
    StringBuilder sb = new StringBuilder();
    sb.append((char)i);
    if (i != '\r' && i != '\n') {
      while (0 <= (i = br.read()) && i != '\r' && i != '\n') {
        sb.append((char)i);
      }
      if (i < 0) return sb.toString();
      sb.append((char)i);
    }
    if (i == '\r') {
      i = br.read();
      if (i != '\n') return sb.toString(); 
      sb.append((char)'\n');
    }
    i = -2;
    return sb.toString();
  }
}
Run Code Online (Sandbox Code Playgroud)

您不会readLine在 Java 中找到这样的内置函数。您可能会readLine在第三方.jar文件中找到相似但不完全匹配的 s。如果您确实需要该功能,我的建议是使用上面的功能。