![](/img/trans.png)
[英]How to chain multiple different InputStreams into one InputStream
[英]Use one InputStream as source for multiple higher level InputStreams (like BufferedReader, DataInputStream)
如果這是個好主意,我只是在徘徊:
InputStreamReader in = new InputStreamReader(socket.getInputStream());
BufferedReader reader = new BufferedReader(in);
DataInputStream dis = new DataInputStream(in);
現在,我想從BufferedReader中讀取內容。 如果某個命令(只是一個字符串)到達,我想繼續從DataInputStream讀取。
這樣行嗎? 如果是,這是好事還是壞事?
(我認為您的示例在什么是讀者和什么是輸入流方面是不完善的,但無論如何我還是會遇到這個問題)
您可以執行類似的操作,但是您需要確切地了解每個組件在緩沖方面的行為。
您正在使用的套接字輸入流將只允許您讀取某個字節一次(檢出InputStream.markSupported()
)。 您可以將該輸入流包裝在BufferedInputStream
,該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);
這是行不通的。
緩沖讀取器讀取緩沖區並將其解析為行。 因此,例如,如果有兩行和一半的行可用,則可能會將有效負載流的標記移到該位置。 現在,您讀了一行,然后決定使用DataInputStream讀取long值。 代碼將嘗試從有效負載流的位置(在2.5行之后)讀取此值。 但是您真的想在第一行之后讀取數字。
我認為這個例子也解釋了為什么這個想法不是一個好習慣。 Java流實現裝飾器(包裝器)模式。 每個流都添加自己的功能。 嘗試用多個包裝器包裝同一“真實”流看起來像是試圖破壞這種封裝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.