簡體   English   中英

將一個InputStream用作多個更高級別InputStream的源(例如BufferedReader,DataInputStream)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM