簡體   English   中英

何時使用字節數組和字節緩沖區?

[英]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)方法)。 使用而言,這並不是那么簡單。 (大多數的教程是太復雜或質量較差,但是這一個會得到你的地方。把它一步?然后閱讀有關的諸多陷阱 。)

你可能很想說ByteBufferbyte[]做了什么, StringBuilderString做了什么。 但是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.

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