2010-07-29 64 views
4

我有兩個類必須閱讀InputStream,第一個只應該解釋流的第一行,但應該從流中刪除第一行,以便B類可以解釋第一行之後的所有內容。當我將InputStream傳遞給BufferedReader並執行readLine()時,這不起作用。閱讀流中的第一行並將其從流中刪除

我知道我可以對流進行讀取,直到遇到\ b但是可能存在更合適的解決方案來完成這項工作?

// Reads the first line from the stream and everything else 
public String retrieveFileNameFromTheFirstLineInInputStream(InputStream in) throws IOException { 
    InputStreamReader isReader = new InputStreamReader(in); 
    BufferedReader reader = new BufferedReader(isReader); 
    return reader.readLine(); 
} 

回答

3

不能InputStream刪除的東西,你就可以從中讀取。請勿使用BufferedReader來讀取該行,因爲它肯定會讀取比InputStreamReader(填充其緩衝區)中的第一行更多的內容,其本身從InputStream中讀取。

我建議使用InputStreamReader來讀取,直到到達行的末尾,然後將InputStream實例傳遞給應讀取它的代碼。

順便說一句,你總是應該指定InputStreamReader使用的編碼,否則系統編碼將用於將InputStream中的字節轉換爲在不同機器上可能不同的字符。

+0

我已經編輯了我的問題,在我的單元測試中出現了錯誤,但確實是讀者讀取所有內容。使用InputStreamReader和InputStream本身的優點是什麼? – 2010-07-29 09:31:53

+0

從我看來,即使InputStreamReader可以緩衝輸入,因此在使用InputStream之後傳遞InputStream將會錯過任何緩衝的第一個InputStreamReader。 – dfrankow 2012-05-18 15:56:48

2

我相信即使InputStreamReader可以緩衝輸入,所以Mike L的答案可能會錯過輸入。

這很尷尬,但是您可以使用Apache commons-io中的ReaderInputStream。所以:

BufferedReader reader = new BufferedReader(
    new InputStreamReader(in)); 
String firstLine = reader.readLine(); 
InputStream in2 = new ReaderInputStream(reader); 
// continue with in2 ..