我在Java中有这个代码:
InputStreamReader isr = new InputStreamReader(getInputStream());
BufferedReader ir = new BufferedReader(isr);
String line;
while ((line = ir.readLine()) != null) {
//do stuff with "line"
}
如果输入流包含以下内容:“hello \ nhey \ ryo \ r \ ngood-day”,则每次迭代后都会跟随行变量:
我想一次读一行,但我想保留行终止字符:
我该怎么做?有没有我可以使用的现成课程?
-
更新:
这是我正在尝试做的以及为什么我需要保留行尾字符(以及为什么EOL字符可能不同)。
我正在阅读POST请求。它们由纯文本消息组成,其中行始终以\ r \ n结尾(按标准规范)。但是,POST请求可能包含二进制数据,这些数据可能包含看起来像Java Reader对象的终止字符的字节。
在我的示例中,正在上传图像。图像数据在一行上发送。但是,图像的二进制数据包含READER将解释为“\ n”,“\ r”或有时“\ r \ n”的字节,如果这两个字节碰巧彼此相邻。
我必须一次读取一行的POST请求,因为它是如何工作的。我想,我可以阅读所有内容然后解析整个事情。但这并不高效,尤其是在上传大文件(比如说1024 MiB)的情况下。
答案 0 :(得分: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();
}
}
你不会在Java中找到这样的readLine
。您可能会在第三方readLine
文件中找到类似但不完全匹配的.jar
。如果您确实需要该功能,我的建议就是使用上面的那个。