2011-01-30 98 views

回答

98

This是它的用途和缺點的一個很好的說明。每當你需要做快速的低級I/O時,你都會使用它。如果你打算實現一個TCP/IP協議,或者你正在編寫一個數據庫(DBMS),這個類將派上用場。

+2

在使用Java和Cassandra DB開發的高流量網站中它有用嗎? – Aklin 2011-01-30 05:38:35

+1

快速搜索後,似乎是的,Cassandra確實使用了ByteBuffer:http://www.mail-archive.com/[email protected]/msg14967.html如果您想知道一個原始網站,那麼可能是,但通常它只會間接地被網站使用 - 通過使用像cassandra – kelloti 2011-01-30 05:48:43

78

ByteBuffer類很重要,因爲它構成了在Java中使用通道的基礎。 字節緩衝區類在字節緩衝器限定六類操作:

  • 絕對和相對getput方法讀取和寫入單個字節;

  • 相對bulk get方法,從這個緩衝到一個數組傳輸的字節的連續序列;

  • 相對bulk put將連續字節序列從字節數組或其他字節緩衝區傳輸到此緩衝區的方法;

  • 絕對和相對get和put方法和寫入其他原始類型的值,將它們轉換到和從在一個特定的字節順序的字節序列;

  • 方法用於創建視圖緩衝劑,其允許含有其他原語類型的值的緩衝器要觀看的字節緩衝器;和

  • 方法爲compacting,duplicatingslicing一個字節緩衝區。

Example code : Putting Bytes into a buffer.

// Create an empty ByteBuffer with a 10 byte capacity 
    ByteBuffer bbuf = ByteBuffer.allocate(10); 

    // Get the buffer's capacity 
    int capacity = bbuf.capacity(); // 10 

    // Use the absolute put(int, byte). 
    // This method does not affect the position. 
    bbuf.put(0, (byte)0xFF); // position=0 

    // Set the position 
    bbuf.position(5); 

    // Use the relative put(byte) 
    bbuf.put((byte)0xFF); 

    // Get the new position 
    int pos = bbuf.position(); // 6 

    // Get remaining byte count 
    int rem = bbuf.remaining(); // 4 

    // Set the limit 
    bbuf.limit(7); // remaining=1 

    // This convenience method sets the position to 0 
    bbuf.rewind(); // remaining=7 
13

在Android中可以創建和Java℃之間共享緩衝器++(以directAlloc法)和操縱它在兩側。

12

使用面向流的API的JAVA IO使用緩衝區作爲用戶空間內數據的臨時存儲。通過DMA從磁盤讀取的數據首先被複制到內核空間的緩衝區中,然後再傳送到用戶空間的緩衝區。因此有開銷。避免它可以在性能上獲得可觀的收益。

我們可以跳過用戶空間這個臨時緩衝區,如果有直接的方式訪問緩衝區在內核空間。 JAVA NIO提供了這樣做的方法。

ByteBuffer是由JAVA NIO提供的幾個緩衝區之一。它只是一個容器或容器來讀取數據或寫入數據。上述行爲通過在緩衝區上使用allocateDirect()API分配直接緩衝區來實現。

Java Documentation of Byte Buffer has useful information.

6

Here是一個偉大的文章,解釋ByteBuffer的好處。以下是文章的關鍵點:字節緩衝區的

  • 先發優勢,而不論它是直接或間接的被結構化的二進制數據(例如,低級別的IO如在一個規定的高效的隨機存取答案)。在Java 1.4之前,要讀取這樣的數據,可以使用DataInputStream,但不能隨機訪問。

以下是專門針對直接ByteBuffer/MappedByteBuffer的好處。需要注意的是直接緩衝區堆之外創建:

  1. 不受GC週期:直接緩衝區不會在垃圾收集週期,因爲他們居住堆外移動。 TerraCota的BigMemory緩存技術似乎很大程度上依賴於這一優勢。如果他們堆在一起,它會減慢gc暫停時間。

  2. 性能升壓:在流IO,讀呼叫將需要系統調用,這需要用戶之間的上下文切換到內核模式,反之亦然,這將是昂貴的,特別是如果正在不斷訪問的文件。但是,使用內存映射時,這種上下文切換會減少,因爲數據更有可能在內存中找到(MappedByteBuffer)。如果數據在內存中可用,則直接訪問它而不調用OS,即不進行上下文切換。

請注意,MappedByteBuffers非常有用,特別是如果文件很大並且塊的訪問次數更少。

  • 頁共享:內存映射文件可以在進程之間共享,因爲它們是在進程的虛擬內存空間分配,並且可以跨進程共享。