Java 緩沖區(qū)讀寫

2018-02-07 19:46 更新

Java IO教程 - Java緩沖區(qū)讀寫

緩沖區(qū)讀取

有兩種方法從緩沖區(qū)讀取數(shù)據(jù):

  • 絕對位置
  • 相對位置

使用四個版本重載的get()方法用于從緩沖區(qū)讀取數(shù)據(jù)。

get(int index)返回給定索引處的數(shù)據(jù)。

get()從緩沖區(qū)中的當前位置返回數(shù)據(jù),并將位置增加1。

get(byte [] destination,int offset,int length)從緩沖區(qū)中批量讀取數(shù)據(jù)。 它從緩沖區(qū)的當前位置讀取長度字節(jié)數(shù),并將它們放在從指定偏移量開始的指定目標數(shù)組中。

get(byte [] destination)通過從緩沖區(qū)的當前位置讀取數(shù)據(jù)并且每次讀取數(shù)據(jù)元素時將當前位置遞增1來填充指定的目標數(shù)組。


緩沖區(qū)寫入

使用重載五個版本的put()方法將數(shù)據(jù)寫入緩沖區(qū)。

put(int index,byte b)將指定的b數(shù)據(jù)寫入指定的索引。 調(diào)用此方法不會更改緩沖區(qū)的當前位置。

put(byte b)將指定的字節(jié)寫入緩沖區(qū)的當前位置,并將位置遞增1。

put(byte [] source,int offset,int length)將起始于偏移量的源數(shù)組的字節(jié)長度寫入從當前位置開始的緩沖區(qū)。 如果緩沖區(qū)中沒有足夠的空間來寫入所有字節(jié),它會拋出BufferOverflowException。 緩沖區(qū)的位置按長度增加。

put(byte [] source)與調(diào)用put(byte [] source,0,source.length)相同。

ByteBuffer put(ByteBuffer src)從指定的字節(jié)緩沖區(qū)src讀取剩余的字節(jié),并將它們寫入緩沖區(qū)。 如果目標緩沖區(qū)中的剩余空間小于源緩沖區(qū)中的剩余字節(jié),則拋出運行時BufferOverflowException。

以下代碼顯示如何寫入緩沖區(qū)和從緩沖區(qū)讀取。

import java.nio.ByteBuffer;

public class Main {
  public static void main(String[] args) {
    ByteBuffer bb = ByteBuffer.allocate(8);
    printBufferInfo(bb);
    for (int i = 50; i < 58; i++) {
      bb.put((byte) i);
    }
    printBufferInfo(bb);
  }

  public static void printBufferInfo(ByteBuffer bb) {
    int limit = bb.limit();
    System.out.println("Position =  " + bb.position() + ", Limit   = " + limit);
    for (int i = 0; i < limit; i++) {
      System.out.print(bb.get(i) + "  ");
    }
    System.out.println();
  }
}

如果我們可以在緩沖區(qū)上使用相對get()或put()方法來讀/寫至少一個元素,則緩沖區(qū)的hasRemaining()方法返回true。

我們可以通過使用相對的get()或put()方法,通過使用其remaining()方法來獲得我們可以讀/寫的最大數(shù)量的元素。

上面的代碼生成以下結(jié)果。

例子

以下代碼顯示如何使用相對讀取和寫入之間的緩沖區(qū)的flip()和hasRemaining()方法。

import java.nio.ByteBuffer;

public class Main {
  public static void main(String[] args) {
    ByteBuffer bb = ByteBuffer.allocate(8);
    printBufferInfo(bb);

    // Use flip() to reset the position to zero because
    // the printBufferInfo() method uses relative get() method
    bb.flip();

    int i = 50;
    while (bb.hasRemaining()) {
      bb.put((byte) i++);
    }

    // Call flip() again to reset the position to zero,
    // because the above put() call incremented the position
    bb.flip();
    printBufferInfo(bb);
  }

  public static void printBufferInfo(ByteBuffer bb) {
    int limit = bb.limit();
    System.out.println("Position =  " + bb.position() + ", Limit   = " + limit);
    while (bb.hasRemaining()) {
      System.out.print(bb.get() + "  ");
    }
    System.out.println();
  }
}

上面的代碼生成以下結(jié)果。

只讀緩沖區(qū)

緩沖區(qū)可以是只讀的或讀寫的。 我們只能讀取只讀緩沖區(qū)的內(nèi)容。

我們可以通過調(diào)用特定緩沖區(qū)類的asReadOnlyBuffer()方法來獲取只讀緩沖區(qū)。

// Create a  buffer that is read-write by  default
ByteBuffer bb  = ByteBuffer.allocate(1024);
boolean readOnly   = bb.isReadOnly(); // false

要檢查緩沖區(qū)是否為只讀,請按如下所示調(diào)用isReadOnly()方法:

ByteBuffer bbReadOnly = bb.asReadOnlyBuffer();
boolean readOnly = bbReadOnly.isReadOnly(); 

asReadOnlyBuffer()方法返回的只讀緩沖區(qū)是同一個緩沖區(qū)的不同視圖。 對原始緩沖區(qū)的內(nèi)容的任何修改都反映在只讀緩沖區(qū)中。

緩沖區(qū)視圖

我們可以獲得緩沖區(qū)的不同視圖。 緩沖區(qū)的視圖與原始緩沖區(qū)共享數(shù)據(jù),并保持其自身的位置,標記和限制。

我們也可以復制一個緩沖區(qū),在這種情況下,它們共享內(nèi)容,但獨立地保持標記,位置和限制。 使用緩沖區(qū)的duplicate()方法獲取緩沖區(qū)的副本如下:

// Create a  buffer
ByteBuffer bb  = ByteBuffer.allocate(1024);

// Create a  duplicate view  of  the   buffer
ByteBuffer bbDuplicate = bb.duplicate();

我們還可以通過使用緩沖區(qū)的slice()方法創(chuàng)建其切片視圖,從而創(chuàng)建緩沖區(qū)的切片視圖,如下所示:

// Create a  buffer
ByteBuffer bb  = ByteBuffer.allocate(8);
bb.position(3);
bb.limit(6);
// bbSlice will have  position set to 0  and  its  limit set to 3. 
ByteBuffer bbSlice  = bb.slice();

我們還可以獲得用于不同原始數(shù)據(jù)類型的字節(jié)緩沖區(qū)的視圖。

例如,我們可以獲得字節(jié)緩沖區(qū)的字符視圖,浮點視圖等。ByteBuffer類包含諸如asCharBuffer(),asLongBuffer(),asFloatBuffer()等方法來獲得原始數(shù)據(jù)類型的視圖。

// Create a  byte   buffer
ByteBuffer bb  = ByteBuffer.allocate(8);

// Create a  char   view  of  the   byte   buffer
CharBuffer cb  = bb.asCharBuffer();

// Create a  float view  of  the   byte   buffer
FloatBuffer fb  = bb.asFloatBuffer();
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號