JAVA NIO缓冲区(Buffer)

您所在的位置:网站首页 bytebuffer扩容 JAVA NIO缓冲区(Buffer)

JAVA NIO缓冲区(Buffer)

2024-07-14 15:32| 来源: 网络整理| 查看: 265

缓冲区(Buffer)

缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区:

使用缓冲区有这么两个好处:

1、减少实际的物理读写次数

2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数

举个简单的例子,比如A地有1w块砖要搬到B地

由于没有工具(缓冲区),我们一次只能搬一本,那么就要搬1w次(实际读写次数)

如果A,B两地距离很远的话(IO性能消耗),那么性能消耗将会很大

但是要是此时我们有辆大卡车(缓冲区),一次可运5000本,那么2次就够了

相比之前,性能肯定是大大提高了。

而且一般在实际过程中,我们一般是先将文件读入内存,再从内存写出到别的地方

这样在输入输出过程中我们都可以用缓存来提升IO性能。

所以,buffer在IO中很重要。在旧I/O类库中(相对java.nio包)中的BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter在其实现中都运用了缓冲区。java.nio包公开了Buffer API,使得Java程序可以直接控制和运用缓冲区。

在Java NIO中,缓冲区的作用也是用来临时存储数据,可以理解为是I/O操作中数据的中转站。缓冲区直接为通道(Channel)服务,写入数据到通道或从通道读取数据,这样的操利用缓冲区数据来传递就可以达到对数据高效处理的目的。在NIO中主要有八种缓冲区类(其中MappedByteBuffer是专门用于内存映射的一种ByteBuffer):

Fields

所有缓冲区都有4个属性:capacity、limit、position、mark,并遵循:mark  remaining()),则不传输字节且将抛出BufferOverflowException。

否则,此方法将给定数组中的 length 个字节复制到此缓冲区中,从数组中给定偏移量位置和此缓冲区的当前位置开始复制。然后此缓冲区的位置将增加length。

换句话说,调用此方法的形式为 dst.put(src, off, len),效果与以下循环语句完全相同:

for (int i = off; i < off + len; i++) dst.put(a[i]); 区别在于它首先检查此缓冲区中是否有足够空间,这样可能效率更高。

参数: src - 要从中读取字节的数组 offset - 要读取的第一个字节在数组中的偏移量;必须为非负且不大于  array.length length - 要从给定数组读取的字节的数量;必须为非负且不大于  array.length - offset 返回: 此缓冲区 抛出: BufferOverflowException - 如果此缓冲区没有足够空间 IndexOutOfBoundsException - 如果关于 offset 和 length 参数的前提不成立 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 16、public final  ByteBuffer  put(byte[] src)相对批量  put  方法 (可选操作) 。

此方法将给定的源 byte 数组的所有内容传输到此缓冲区中。调用此方法的形式为 dst.put(a),该调用与以下调用完全相同:

dst.put(a, 0, a.length)

返回: 此缓冲区 抛出: BufferOverflowException - 如果此缓冲区没有足够空间 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 17、public final boolean hasArray() 判断是否可通过一个可访问的 byte 数组实现此缓冲区。

如果此方法返回 true,则可以安全地调用 array 和arrayOffset 方法。

指定者: 类  Buffer 中的 hasArray 返回: 当且仅当存在实现此缓冲区的数组,并且此缓冲区不是只读缓冲区时,返回  true 18、public final byte[] array() 返回实现此缓冲区的 byte 数组 (可选操作)。

此缓冲区的内容修改将导致返回的数组内容修改,反之亦然。

调用此方法之前要调用 hasArray 方法,以确保此缓冲区具有可访问的底层实现数组。

指定者: 类  Buffer 中的 array 返回: 实现此缓冲区的数组 抛出: ReadOnlyBufferException - 如果存在实现此缓冲区的数组,但缓冲区是只读的 UnsupportedOperationException - 如果不存在某个可访问的数组实现此缓冲区 19、public final int arrayOffset() 返回此缓冲区中的第一个元素在缓冲区的底层实现数组中的偏移量 (可选操作)。

如果存在实现此缓冲区的数组,则缓冲区位置 p 对应于数组索引 p + arrayOffset()。

调用此方法之前要调用 hasArray 方法,以确保此缓冲区具有可访问的底层实现数组。

指定者: 类  Buffer 中的 arrayOffset 返回: 此缓冲区的第一个元素在缓冲区数组中的偏移量 抛出: ReadOnlyBufferException - 如果存在实现此缓冲区的数组,但缓冲区是只读的 UnsupportedOperationException - 如果不存在某个可访问的数组实现此缓冲区 20、public abstract  ByteBuffer  compact() 压缩此缓冲区 (可选操作)。

将缓冲区的当前位置和界限之间的字节(如果有)复制到缓冲区的开始处。即将索引 p = position() 处的字节复制到索引 0 处,将索引p + 1 处的字节复制到索引 1 处,依此类推,直到将索引limit() - 1 处的字节复制到索引 n = limit() - 1 - p 处。然后将缓冲区的位置设置为n+1,并将其界限设置为其容量。如果已定义了标记,则丢弃它。

将缓冲区的位置设置为复制的字节数,而不是零,以便调用此方法后可以紧接着调用另一个相对 put 方法。

从缓冲区写入数据之后调用此方法,以防写入不完整。例如,以下循环语句通过 buf 缓冲区将字节从一个信道复制到另一个信道:

buf.clear(); // Prepare buffer for use while (in.read(buf) >= 0 || buf.position != 0) { buf.flip(); out.write(buf); buf.compact(); // In case of partial write }

返回: 此缓冲区 抛出: ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 21、public abstract boolean isDirect() 判断此字节缓冲区是否为直接的。

指定者: 类  Buffer 中的 isDirect 返回: 当且仅当此缓冲区为直接时,返回  true 22、public  String  toString() 返回汇总了此缓冲区状态的字符串。

覆盖: 类  Object 中的 toString 返回: 一个汇总字符串 23、public int hashCode()返回此缓冲区的当前哈希码。

字节缓冲区的哈希码仅取决于其中剩余的元素;也就是说,取决于从 position() 开始一直到(包括)limit() - 1 处的元素。

因为缓冲区哈希码与内容有关,因此建议不要在哈希映射或其他类似数据结构中将缓冲区用作键,除非知道其内容不会发生更改。

覆盖: 类  Object 中的 hashCode 返回: 此缓冲区的当前哈希码。 24、public boolean equals( Object  ob)判断此缓冲区是否与另一个对象相同。

当且仅当满足以下条件时两个字节缓冲区相同:

它们具有相同的元素类型,

它们具有相同数量的剩余元素,并且

两个剩余元素序列(与它们的起始位置无关)逐点相同。

字节缓冲区与任何其他类型的对象都不同。

覆盖: 类  Object 中的 equals 参数: ob - 此缓冲区要比较的对象 返回: 当且仅当此缓冲区与给定对象相同时,返回  true 25、public int compareTo( ByteBuffer  that) 将此缓冲区与另一个缓冲区进行比较。

比较两个字节缓冲区的方法是按字典顺序比较它们的剩余元素序列,而不考虑每个序列在其对应缓冲区中的起始位置。

字节缓冲区不能与任何其他类型的对象进行比较。

指定者: 接口  Comparable 中的 compareTo 参数: that - 要比较的对象。 返回: 当此缓冲区小于、等于或大于给定缓冲区时,返回负整数、零或正整数 26、public final  ByteOrder  order() 获取此缓冲区的字节顺序。在读写多字节值以及为此字节缓冲区创建视图时使用该字节顺序。新创建的字节缓冲区的顺序始终为 BIG_ENDIAN 。 27、public final  ByteBuffer  order( ByteOrder  bo) 修改此缓冲区的字节顺序。 参数: bo  - 新的字节顺序,要么是  BIG_ENDIAN ,要么是 LITTLE_ENDIAN 返回: 此缓冲区 28、public abstract char getChar() 用于读取 char 值的相对  get  方法。

读取此缓冲区的当前位置之后的两个字节,根据当前的字节顺序将它们组成 char 值,然后将该位置增加 2。

返回: 缓冲区当前位置的 char 值 抛出: BufferUnderflowException - 如果此缓冲区中的剩余字节数少于 2 29、public abstract  ByteBuffer  putChar(char value)   用来写入 char 值的相对  put 方法 (可选操作)。

将两个包含指定 char 值的字节按照当前的字节顺序写入到此缓冲区的当前位置,然后将该位置增加 2。

参数: value - 要写入的 char 值 返回: 此缓冲区 抛出: BufferOverflowException - 如果此缓冲区中的剩余字节数少于 2 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 30、public abstract char getChar(int index) 用于读取 char 值的绝对  get  方法。 读取给定索引处的两个字节,并根据当前的字节顺序将它们组成 char 值。 参数: index - 将从该位置读取字节的索引 返回: 给定索引处的 char 值 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 1 所得的值 31、public abstract  ByteBuffer  putChar(int index, char value)   用于写入 char 值的绝对  put 方法 (可选操作)。

将两个包含给定 char 值的字节按照当前的字节顺序写入到此缓冲区的给定索引处。

参数: index - 将在该位置写入字节的索引 value - 要写入的 char 值 返回: 此缓冲区 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 1 所得的值 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 32、public abstract  CharBuffer  asCharBuffer()  创建此字节缓冲区的视图,作为 char 缓冲区。

新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。

新缓冲区的位置将为零,其容量和界限将为此缓冲区中所剩余的字节数的二分之一,其标记是不确定的。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。

返回: 新的 char 缓冲区 33、public abstract short getShort()  用于读取 short 值的相对  get 方法。

读取此缓冲区的当前位置之后的两个字节,根据当前的字节顺序将它们组成 short 值,然后将该位置增加 2。

返回: 缓冲区当前位置的 short 值 抛出: BufferUnderflowException - 如果此缓冲区中的剩余字节数少于 2 34、public abstract  ByteBuffer  putShort(short value)  用于写入 short 值的相对  put  方法 (可选操作) 。

将两个包含指定 short 值的字节按照当前的字节顺序写入到此缓冲区的当前位置,然后将该位置增加 2。

参数: value - 要写入的 short 值 返回: 此缓冲区 抛出: BufferOverflowException - 如果此缓冲区中的剩余字节数少于 2 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 35、public abstract short getShort(int index)   用于读取 short 值的绝对  get 方法。

读取给定索引处的两个字节,根据当前的字节顺序将它们组成 short 值。

参数: index - 将从该位置读取字节的索引 返回: 给定索引处的 short 值 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 1 所得的值 36、public abstract  ByteBuffer  putShort(int index,short value)  用于写入 short 值的绝对  put  方法 (可选操作) 。

将两个包含给定 short 值的字节按照当前的字节顺序写入到此缓冲区的给定索引处。

参数: index - 将在该位置写入字节的索引 value - 要写入的 short 值 返回: 此缓冲区 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 1 所得的值 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 37、public abstract  ShortBuffer  asShortBuffer()   创建此字节缓冲区的视图,作为 short 缓冲区。

新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。

新缓冲区的位置将为零,其容量和界限将为此缓冲区中所剩余的字节数的二分之一,其标记是不确定的。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。

返回: 新的 short 缓冲区 38、public abstract int getInt()  用于读取 int 值的相对  get 方法。

读取此缓冲区的当前位置之后的 4 个字节,根据当前的字节顺序将它们组成 int 值,然后将该位置增加 4。

返回: 缓冲区当前位置的 int 值 抛出: BufferUnderflowException - 如果此缓冲区中的剩余字节数少于 4 39、public abstract  ByteBuffer  putInt(int value)  用于写入 int 值的相对  put  方法 (可选操作) 。

将 4 个包含给定 int 值的字节按照当前的字节顺序写入到此缓冲区的当前位置,然后将该位置增加 4。

参数: value - 要写入的 int 值 返回: 此缓冲区 抛出: BufferOverflowException - 如果此缓冲区中的剩余字节数少于 4 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 40、public abstract int getInt(int index)  用于读取 int 值的绝对  get  方法。

读取给定索引处的 4 个字节,根据当前的字节顺序将它们组成 int 值。

参数: index - 将从该位置读取字节的索引 返回: 给定索引处的 int 值 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 3 所得的值 41、public abstract  ByteBuffer  putInt(int index, int value) 用于写入 int 值的绝对  put 方法 (可选操作)。

将 4 个包含给定 int 值的字节按照当前的字节顺序写入到此缓冲区的给定索引处。

参数: index - 将在该位置写入字节的索引 value - 要写入的 int 值 返回: 此缓冲区 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 3 所得的值 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 42、public abstract  IntBuffer  asIntBuffer()   创建此字节缓冲区的视图,作为 int 缓冲区。

新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。

新缓冲区的位置将为零,其容量和界限将为此缓冲区中所剩余的字节数的四分之一,其标记是不确定的。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。

返回: 新的 int 缓冲区 43、public abstract long getLong()   用于读取 long 值的相对  get 方法。

读取此缓冲区的当前位置之后的 8 个字节,根据当前的字节顺序将它们组成 long 值,然后将该位置增加 8。

返回: 缓冲区当前位置的 long 值 抛出: BufferUnderflowException - 如果此缓冲区中的剩余字节数少于 8 44、public abstract  ByteBuffer  putLong(long value)   用于写入 long 值 (可先操作) 的相对  put 方法。

将 8 个包含给定 long 值的字节按照当前的字节顺序写入到此缓冲区的当前位置,然后将该位置增加 8。

参数: value - 要写入的 long 值 返回: 此缓冲区 抛出: BufferOverflowException - 如果此缓冲区中的剩余字节数少于 8 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 45、public abstract long getLong(int index)   用于读取 long 值的绝对  get 方法。

读取给定索引处的 8 个字节,根据当前的字节顺序将它们组成 long 值。

参数: index - 将从该位置读取字节的索引 返回: 给定索引处的 long 值 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 7 所得的值 46、public abstract  ByteBuffer  putLong(int index,long value)   用于写入 long 值的绝对  put 方法 (可选操作)。

将 8 个包含给定 long 值的字节按照当前的字节顺序写入到此缓冲区的给定索引处。

参数: index - 将在该位置写入字节的索引 value - 要写入的 long 值 返回: 此缓冲区 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 7 所得的值 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 47、public abstract  LongBuffer  asLongBuffer()  创建此字节缓冲区的视图,作为 long 缓冲区。

新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。

新缓冲区的位置将为零,其容量和界限将为此缓冲区中所剩余的字节数的八分之一,其标记是不确定的。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。

返回: 新的 long 缓冲区 48、public abstract float getFloat() 用于读取 float 值的相对  get  方法。

读取此缓冲区的当前位置之后的 4 个字节,根据当前的字节顺序将它们组成 float 值,然后将该位置增加 4。

返回: 缓冲区当前位置的 float 值 抛出: BufferUnderflowException - 如果此缓冲区中的剩余字节数少于 4 49、public abstract  ByteBuffer  putFloat(float value)   用于写入 float 值的相对  put 方法 (可选操作)。

将 4 个包含给定 float 值的字节按照当前的字节顺序写入到此缓冲区的当前位置,然后然后将该位置增加 4。

参数: value - 要写入的 float 值 返回: 此缓冲区 抛出: BufferOverflowException - 如果此缓冲区中的剩余字节数少于 4 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 50、public abstract float getFloat(int index)  用于读取 float 值的绝对  get  方法。

读取给定索引处的 4 个字节,根据当前的字节顺序将它们组成 float 值。

参数: index - 将从该位置读取字节的索引 返回: 给定索引处的 float 值 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 3 所得的值 51、public abstract  ByteBuffer  putFloat(int index, float value)  用于写入 float 值的绝对  put  方法 (可选操作) 。

将 4 个包含给定 float 值的字节按照当前的字节顺序写入到此缓冲区的给定索引处。

参数: index - 将在该位置写入字节的索引 value - 要写入的 float 值 返回: 此缓冲区 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 3 所得的值 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 52、public abstract  FloatBuffer  asFloatBuffer() 创建此字节缓冲区的视图,作为 float 缓冲区。

新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。

新缓冲区的位置将为零,其容量和其界限将为此缓冲区中剩余字节数的四分之一,其标记是不确定的。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。

返回: 新的 float 缓冲区 53、public abstract double getDouble()   用于读取 double 值的相对  get 方法。

读取此缓冲区的当前位置之后的 8 个字节,根据当前的字节顺序将它们组成 double 值,然后将该位置增加 8。

返回: 缓冲区当前位置的 double 值 抛出: BufferUnderflowException - 如果此缓冲区中的剩余字节数少于 8 54、public abstract  ByteBuffer  putDouble(double value) 用于写入 double 值的相对  put  方法 (可选操作) 。

将 8 个包含给定 double 值的字节按照当前的字节顺序写入到此缓冲区的当前位置,然后将该位置增加 8。

参数: value - 要写入的 double 值 返回: 此缓冲区 抛出: BufferOverflowException - 如果此缓冲区中的剩余字节数少于 8 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 55、public abstract double getDouble(int index)用于读取 double 值的绝对  get  方法。

读取给定索引处的 8 个字节,根据当前的字节顺序将它们组成 double 值。

参数: index - 将从该位置读取字节的索引 返回: 给定索引处的 double 值 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 7 所得的值 56、public abstract  ByteBuffer  putDouble(int index, double value)用于写入 double 值的绝对  put  方法 (可选操作) 。

将 8 个包含给定 double 值的字节按照当前的字节顺序写入到此缓冲区的给定索引处。

参数: index - 将在该位置写入字节的索引 value - 要写入的 double 值 返回: 此缓冲区 抛出: IndexOutOfBoundsException - 如果 index 为负数,或者不小于该缓冲区的界限 - 7 所得的值 ReadOnlyBufferException - 如果此缓冲区是只读缓冲区 57、public abstract  DoubleBuffer  asDoubleBuffer() 创建此字节缓冲区的视图,作为 double 缓冲区。

新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。

新缓冲区的位置将为零,其容量和界限将为此缓冲区中所剩余的字节数的八分之一,其标记是不确定的。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。

返回: 新的 double 缓冲区


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3