从Java中的输入流中读取一行文本,保留行终止字符
我在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”,则每次迭代时都会跟随行变量:
- 你好
- 嘿
- 哟
- 美好的一天
我想一次读一行,但我想保留行终止字符:
- 你好\ n
- 哎\ r
- 哟\ r \ n
- 美好的一天
我怎样才能做到这一点? 有没有我可以使用的现成课程?
–
更新:
这是我正在尝试做的以及为什么我需要保持行尾字符(以及为什么EOL字符可能不同)。
我正在阅读POST请求。 它们由纯文本消息组成,其中行总是以\ r \ n结尾(按标准规范)。 但是,POST请求可能包含二进制数据,这些数据可能包含看起来像Java Reader对象的终止字符的字节。
在我的示例中,正在上载图像。 图像数据在一行上发送。 但是,图像的二进制数据包含READER将解释为“\ n”,“\ r”或有时“\ r \ n”的字节,如果这两个字节碰巧彼此相邻的话。
我必须一次读取一行的POST请求,因为它是如何工作的。 我想,我可以阅读所有内容然后解析整个事情。 但这并不高效,尤其是在上传大文件(例如1024 MiB)的情况下。
如果你想读取HTTP POST请求,我强烈建议直接使用BufferedInputStream.read()
(不是BufferedReader
!)(不需要readLine
的中间抽象),手动注意所有细节,包括处理CR和LF根据HTTP RFC。
以下是我对更具体问题的回答(如何准确实现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
。 您可能会在第三方.jar
文件中找到类似但不完全匹配的readLine
。 我的建议就是使用上面的那个,如果你真的需要这个function。
- 给定Java InputStream,如何确定流中的当前偏移量?
- 读取12 MB的巨大文件时出现问题(java.lang.OutOfMemoryError)
- JAVA:将数据(从数据库)导出到Excel并将其发送到客户端
- 在Java中向InputStream的开头和结尾添加字符
- 如何从扩展名为.html的网页下载pdf文件programmatticaly?
- 如何获取正在上载的文件的InputStream的MIME类型?
- 如何模拟FileInputStream和其他* Streams
- 如何清除/重置/打开输入流,以便它可以在Java中的两种不同方法中使用?
- Java数据库BLOB到Java中的InputStream?