2011-10-23 24 views
1

我只是遊蕩,如果這是一個好或壞主意:使用一個的InputStream源多更高水平InputStreams(比如BufferedReader類,DataInputStream類)

InputStreamReader in = new InputStreamReader(socket.getInputStream()); 
BufferedReader reader = new BufferedReader(in); 
DataInputStream dis = new DataInputStream(in); 

現在,我想從BufferedReader中閱讀。如果某個命令(只是一個字符串)到達,我想繼續讀取DataInputStream。

這是行不通的?如果是的話,這是否被認爲是好的或不好的做法?

+1

這將無法編譯:您無法從「InputStreamReader」(基於字符)創建「(Data)InputStream」(以字節爲單位)(只能反過來:流傳輸到reader)。在運行時,由於緩衝問題,它很可能仍會失敗 - 您想要對「BufferedReader」和「DataInputStream」做什麼? –

回答

5

(我想你的例子是,對於什麼是閱讀器,什麼是輸入流方面打破,但我得到反正這個問題)

你可以做這樣的事情,但你需要知道究竟如何每個組件的行爲都與緩衝有關。

您正在使用的套接字輸入流將只允許您讀取一次某個字節(結帳InputStream.markSupported())。您可以將該輸入流包裝在BufferedInputStream中,該輸入流有效地讀取了一些字節,但也添加了功能來執行mark()reset()

這意味着在BufferedInputStream之上的任何讀取器/輸入流可以預讀,標記,跳回等。但是在這裏您需要小心,以免添加另一層「緩衝區」 - 即BufferedReader>InputStreamReader>BufferedInputStream>InputStream。因此,答案是肯定的,它可以工作,只是知道每個組件的確切行爲(我經常看到人們只是爲了地獄而扔掉BufferedXXX)。

在你的榜樣,我會做:

BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); 
InputStreamReader reader = new InputStreamReader(in, "utf-8"); // consider char encoding 
DataInputStream dis = new DataInputStream(in); 
2

這是行不通的。

緩衝讀取器讀取緩衝區並將其解析爲行。因此,如果例如有2行和半行可用,它可能將有效載荷流的標記移動到該位置。現在你讀取一行,然後決定使用DataInputStream讀取長整型值。代碼將嘗試從有效負載流的位置(2.5行之後)讀取此值。但你真的想在第一行之後讀取數字。

我想這個例子也解釋了爲什麼這個想法不是一個好的做法。 Java流實現裝飾器(包裝)模式。每個流都添加了自己的功能。試圖用幾個包裝器包裝相同的「真正」流看起來像試圖打破這種封裝。

相關問題