[英]When to use byte array & when byte buffer?
字節數組和字節緩沖區有什么區別?
此外,在什么情況下應該優先於另一個?
[我的用例是用於在java中開發的Web應用程序]。
實際上有許多方法可以處理字節。 我同意選擇最好的一個並不總是那么容易:
byte[]
java.nio.ByteBuffer
java.io.ByteArrayOutputStream
(與其他流組合) java.util.BitSet
byte[]
只是一個原始數組,只包含原始數據。 因此,它沒有方便的方法來構建或操作內容。
ByteBuffer
更像是一個建設者。 它創建一個byte[]
。 與數組不同,它有更方便的輔助方法。 (例如append(byte)
方法)。 就使用而言,這並不是那么簡單。 (大多數的教程是太復雜或質量較差,但是這一個會得到你的地方。把它一步?然后閱讀有關的諸多陷阱 。)
你可能很想說ByteBuffer
對byte[]
做了什么, StringBuilder
對String
做了什么。 但是ByteBuffer
類有一個特定的差異/缺點。 就像數組一樣, ByteBuffer
具有固定的大小。 因此,在實例化它時,您必須指定緩沖區的大小。
這就是原因之一,為什么我經常更喜歡使用ByteArrayOutputStream
因為它會像ArrayList
一樣自動調整大小 。 (它有一個toByteArray()
方法)。 有時將它包裝在DataOutputStream
是實用的。 優點是你將有一些額外的便利調用,(例如,如果需要寫2個字節,則為writeShort(int)
。)
當您想要執行位級操作時, BitSet
會派上用場。 您可以獲取/設置單個位,它具有邏輯運算符方法,如xor()
。 ( toByteArray()
方法僅在java 7中引入。)
當然,根據您的需要,您可以將所有這些組合起來構建您的byte[]
。
ByteBuffer是為基於文件的數據的快速吞吐量而開發的新IO包(nio)的一部分。 具體來說,Apache是一個非常快速的Web服務器(用C語言編寫),因為它從磁盤讀取字節並直接將它們放在網絡上,而不需要通過各種緩沖區進行混洗。 它通過內存映射文件實現這一點,而早期版本的Java沒有這些文件。 隨着nio的出現,可以在Java中編寫一個與Apache一樣快的Web服務器。 當您需要非常快的文件到網絡吞吐量時,則需要使用內存映射文件和ByteBuffer。
數據庫通常使用內存映射文件,但這種用法在Java中很少有效。 在C / C ++中,可以加載大量內存並將其轉換為您想要的類型化數據。 由於Java的安全模型,這通常不可行,因為您只能轉換為某些本機類型,並且這些轉換效率不高。 當您將字節作為普通字節數據處理時,ByteBuffer效果最佳 - 一旦您需要將它們轉換為對象,其他Java io類通常表現更好並且更易於使用。
如果你不處理內存映射文件,那么你真的不需要打擾ByteBuffer - 你通常使用byte數組。 如果您正在嘗試使用基於文件的原始字節數據的最快吞吐量來構建Web服務器,那么ByteBuffer(特別是MappedByteBuffer)是您最好的朋友。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.