2011-12-13 91 views
2

Java是否有一個簡單的方法來從InputStream中讀取一行而不進行緩衝? BufferedReader不適合我的需求,因爲我需要通過相同的連接重複傳輸文本和二進制數據,並且緩衝僅僅是阻礙。從InputStream讀取沒有緩衝的行

+0

通過二進制數據,你不必行,對嗎?如何識別您的數據是文本還是二進制? – belgther

+1

我確實擁有它們。請求以描述它的文本行開始,有時後跟二進制數據。 – Ree

+0

可能的重複:http://stackoverflow.com/questions/25215564/how-to-read-a-line-from-inputstream-without-buffering-the-input –

回答

0

你可以嘗試Scanner類:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

然而,這可以緩衝輸入,如果沒有換行符存在:

由於這種方法會繼續在輸入尋找搜索行 分隔符,如果沒有 行分隔符存在,它可能會緩存搜索要跳過的行的所有輸入。

+0

掃描儀緩衝輸入甚至超過換行符:( –

+0

'Scanner'確實緩衝區超過換行符,我有一個'StringR eader'有七條線和'Scanner'將它們全部緩衝在一起。 –

-1

用BufferedReader讀取InputStream並將讀取的行添加到String中可能會更好。

然後,您可以根據需要操作字符串,而無需擔心緩衝。

+1

問題是我無法控制BufferedReader如何讀取輸入。它可能會讀取一行和一大塊數據。我不想那樣。 – Ree

+0

@Ree,我認爲Scanner只向後緩衝,不向前。 – Tudor

4

最終它是直接從InputStream中直接讀取byte後的字節,而沒有包裝InputStream。一切我想,像掃描儀和InputStreamReader的,預讀(緩衝區)輸入:(

我想我錯過了一些情況下,像\ r。

public static String readLine(InputStream inputStream) throws IOException { 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    int c; 
    for (c = inputStream.read(); c != '\n' && c != -1 ; c = inputStream.read()) { 
     byteArrayOutputStream.write(c); 
    } 
    if (c == -1 && byteArrayOutputStream.size() == 0) { 
     return null; 
    } 
    String line = byteArrayOutputStream.toString("UTF-8"); 
    return line; 
}