你可能並不總是需要緩衝,因此,答案是否定的,在某些情況下,它只是開銷。
還有一個原因是「不」,可能會更嚴重。當您在網絡套接字上使用時,如果您也啓用了套接字上的超時,那麼BufferedInputStream
(或BufferedReader
)可能會導致不可預知的故障。讀取數據包時可能會發生超時。即使您知道有一些非零字節數(請參閱java.net.SocketTimeoutException
,它是java.io.InterruptedIOException
的子類,因此有bytesTransferred
變量可用),您將不再能夠訪問傳輸到該點的數據。
如果您想知道在讀取時如何發生套接字超時,只需考慮調用read(bytes[])
方法,並且包含該消息的原始數據包最終將被拆分,但其中一個部分數據包延遲超時(或超時的剩餘部分)。如果再次執行java.io.DataInput
(多個字節值的任何讀取,如readLong()
或readFully()
或BufferedReader.readLine()
方法),則可能會更頻繁地發生這種情況。
注意java.io.DataInputStream
也就是對於具有超時,因爲它不超時異常表現良好或者socket流不好的候選人。
這似乎意味着該商標和復位是唯一有用的東西'BufferedInputStream'增加了一個普通的'InputStream'。從API的意義上說,這可能是正確的,但正如其他人所說的那樣,「BufferedInputStream」負責爲你緩衝讀取。從「FileInputStream」中讀取字節的速度比從「BufferedInputStream」中讀取的速度慢40倍。也就是說,返回'InputStream'並保留你的方法簽名。用戶可以根據需要換行。 – jasonmp85 2010-06-03 08:06:45
我同意從性能的角度來看,最好將它包裝在99.9%的案例中。但是,它確實減輕了消費者的責任,思考如何使用InputStream。消費者的這些假設限制了可重用性。 – 2010-06-03 08:19:53
我認爲在的情況下,而不是更多的0.1%的消費者不會一次讀取一個字節,而是將自己使用某種緩衝的,在這種情況下的BufferedInputStream是無用的開銷。 – 2010-06-03 10:19:47