2010-12-15 16 views
11

我有這樣的代碼在Java中:在Java中從輸入流中讀取文本行的保持線終止字符(S)

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

如果輸入流包含以下內容:「你好\ nhey \阪\ r \ ngood天」,然後行變量將在之後每次迭代:

  1. 你好
  2. 好達Ÿ

我想讀一次在一個線,但我想保持行終止字符(S):

  1. 你好\ n
  2. 哎\ r
  3. 喲\ r \ n
  4. 好天

我怎樣才能做到這一點?有沒有可以使用的現成課程?

-

更新:

這裏就是我想要做的,爲什麼我需要保持結束行的字符(以及爲什麼EOL字符可能會有所不同)。

我正在閱讀POST請求。它們由純文本消息組成,其中行總是以\ r \ n結尾(按照標準規範)。但POST請求可能包含二進制數據,其中可能包含看起來像Java Reader對象的終止字符的字節。

在我的示例中,正在上傳圖像。圖像數據在一行中發送。然而,圖像的二進制數據包含READER會解釋爲「\ n」,「\ r」或有時是「\ r \ n」的字節,如果這兩個字節碰巧彼此相鄰。

我必須一次讀取POST請求一行,因爲這是它的工作原理。我想,我可以讀一切,然後解析整個事情。但是這樣做效率不高,尤其是在上傳大文件(比如1024 MiB)文件時。

+0

如果找不到更好的解決方案,可以在'while'循環中使用'BufferedReader.read()'實現'readLine'。 – pts 2010-12-15 00:49:40

+0

我希望這個非常基本的東西已經完成了,人們可能會認爲它們可以讓BufferedReader的readLine()方法接受一個布爾值 - 如果是true,它也會包含行分隔符字符和如果錯誤,它會像現在這樣做。 – Mike 2010-12-15 00:55:07

+0

特殊的最終角色是否重要?因爲我認爲的第一件事就是在行 – TheLQ 2010-12-15 00:57:48

回答

4

如果你想讀一個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(); 
    } 
} 

你不會找到這樣的readLine內置到Java。很可能您會在第三方.jar文件中找到類似但不完全匹配的readLine。我的建議只是使用上面的那個,如果你真的需要這個功能的話。

+0

這正是我希望不必自己寫的代碼,非常感謝!儘管如此,仍然認爲它應該在Java中。 – Mike 2010-12-15 00:57:09

+1

當那些java API被設計出來時,特定於平臺的行尾編碼比現在更加不可思議。他們正試圖讓你不必處理\ n vs \ r vs \ r \ n與上帝在1993年只通過提供readLine和writeLine並在內部處理它只知道專有* Nixes使用的是什麼。 – Affe 2010-12-15 01:02:47

+0

影響:我認爲你的推理有一個小的事實錯誤。我的一般理解是所有的Unix系統總是有''n''(等於'10')作爲行終止符。 – pts 2010-12-15 01:04:41

相關問題