鍍金池/ 教程/ Java/ Java緩沖區(qū)讀寫
Java文件屬性
Java FilePermission示例
Java Externalizable實例
Java文件操作
Java文件鎖
Java文件系統(tǒng)
Java異步I/O
Java Reader/Writer
Java File實例
Java FileReader示例
Java控制臺
Java文件所有者權(quán)限
Java通道
Java ByteArrayOutputStream示例
BufferedOutputStream示例
Java FileInputStream示例
Java DataInputStream
Java BufferedInputStream
Java Jar Manifest
Java Console類示例
BufferedWriter示例
Java輸入/輸出教程
Java對象序列化
Java文件教程
Java DataInputStream類型
Java Zip字節(jié)數(shù)組
Java FileWriter示例
FileOutputStream示例
Java PrintStream
Java Scanner類
BufferedInputStream示例
Java字符集
ByteArrayInputStream示例
Java路徑操作
Java DataOutputStream
Java符號鏈接
Java FilterWriter示例
Java Jar API
BufferedReader實例
Java Pipe(管道)
Java jar文件
Java CharArrayReader示例
Java CharArrayWriter示例
Java PushbackInputStream
Java FilterReader示例
Java zip文件
Java InputStream
Java標(biāo)準(zhǔn)輸入/輸出/錯誤流
Java文件內(nèi)容和讀寫
Java FilterInputStream示例
Java內(nèi)存通道
Java路徑
Java令牌和字符串拆分
Java隨機(jī)訪問文件
Java文件樹
Java緩沖區(qū)讀寫
Java FileOutputStream
Java目錄事件
Java FilterOutputStream示例
Java DataOutputStream實例
FileDescriptor示例

Java緩沖區(qū)讀寫

緩沖區(qū)讀

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

  • 絕對位置
  • 相對位置

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

  • get(int index)返回給定索引處的數(shù)據(jù)。
  • get()從緩沖區(qū)中的當(dāng)前位置返回數(shù)據(jù),并將位置增加1。
  • get(byte [] destination,int offset,int length)從緩沖區(qū)中批量讀取數(shù)據(jù)。 它從緩沖區(qū)的當(dāng)前位置讀取長度字節(jié)數(shù),并將它們放在從指定偏移量開始的指定目標(biāo)數(shù)組中。

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

緩沖區(qū)寫入

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

  • put(int index,byte b)將指定的b數(shù)據(jù)寫入指定的索引。調(diào)用此方法不會更改緩沖區(qū)的當(dāng)前位置。
  • put(byte b)將指定的字節(jié)寫入緩沖區(qū)的當(dāng)前位置,并將位置遞增1。

  • put(byte [] source,int offset,int length)將起始于偏移量的源數(shù)組的字節(jié)長度寫入從當(dāng)前位置開始的緩沖區(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ū)。如果目標(biāo)緩沖區(qū)中的剩余空間小于源緩沖區(qū)中的剩余字節(jié),則拋出運(yùn)行時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é)果。

Position =  0, Limit   = 8
0  0  0  0  0  0  0  0  
Position =  8, Limit   = 8
50  51  52  53  54  55  56  57

示例

以下代碼顯示如何使用相對讀取和寫入緩沖區(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é)果。

Position =  0, Limit   = 8
0  0  0  0  0  0  0  0  
Position =  0, Limit   = 8
50  51  52  53  54  55  56  57

只讀緩沖區(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ù),并保持其自身的位置,標(biāo)記和限制。
也可以復(fù)制一個緩沖區(qū),在這種情況下,它們共享內(nèi)容,但獨立地保持標(biāo)記,位置和限制。 使用緩沖區(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();