千家信息网

java.nio.ByteBuffer源码是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"java.nio.ByteBuffer源码是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够
千家信息网最后更新 2026年11月01日java.nio.ByteBuffer源码是什么

本篇内容介绍了"java.nio.ByteBuffer源码是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

版本:JDK7

package java.nio;

public abstract class ByteBuffer extends Buffer implements Comparable {

// These fields are declared here rather than in Heap-X-Buffer in order to// reduce the number of virtual method invocations needed to access these// values, which is especially costly when coding small buffers.//final byte[] hb;                  // Non-null only for heap buffersfinal int offset;boolean isReadOnly;                 // Valid only for heap buffersByteBuffer(int mark, int pos, int lim, int cap, byte[] hb, int offset) {    super(mark, pos, lim, cap);    this.hb = hb;    this.offset = offset;}ByteBuffer(int mark, int pos, int lim, int cap) { // package-private    this(mark, pos, lim, cap, null, 0);}// 创建一个容量为capacity的ByteBuffer对象public static ByteBuffer allocateDirect(int capacity) {    return new DirectByteBuffer(capacity);}// 创建一个容量为capacity的ByteBuffer对象public static ByteBuffer allocate(int capacity) {    if (capacity < 0) throw new IllegalArgumentException();    return new HeapByteBuffer(capacity, capacity);}public static ByteBuffer wrap(byte[] array, int offset, int length) {    try {        return new HeapByteBuffer(array, offset, length);    } catch (IllegalArgumentException x) {        throw new IndexOutOfBoundsException();    }}public static ByteBuffer wrap(byte[] array) {    return wrap(array, 0, array.length);}public abstract ByteBuffer slice();public abstract ByteBuffer duplicate();public abstract ByteBuffer asReadOnlyBuffer();/** * Reads the byte at this buffer's position, and then increments the position. */// 读取单个字节,并将position自增1public abstract byte get();/** * Writes the given byte into this buffer at the current position, and then increments the position.  */// 将给定的单个字节写入缓冲区的当前位置,并将position自增1public abstract ByteBuffer put(byte b);// 读取指定位置的字节,注意:不会改变positionpublic abstract byte get(int index);// 将给定的单个字节写入缓冲区的index位置,注意:不会改变positionpublic abstract ByteBuffer put(int index, byte b);// -- Bulk get operations --/** * This method transfers bytes from this buffer into the given destination array.  */// (从Buffer中)读取多个字节(从索引offset开始,读取length长度的数据)到dst中,如果Buffer剩余的空间小于length,则抛异常public ByteBuffer get(byte[] dst, int offset, int length) {    checkBounds(offset, length, dst.length);    if (length > remaining())        throw new BufferUnderflowException();    int end = offset + length;    for (int i = offset; i < end; i++)        dst[i] = get();    return this;}/** * This method transfers bytes from this buffer into the given destination array. */// 批量读取dst.length个字节到dst中,如果Buffer剩余的空间小于dst的length,则抛异常public ByteBuffer get(byte[] dst) {    return get(dst, 0, dst.length);}// -- Bulk put operations --/** * 将src中的数据写入Buffer的当前位置 */public ByteBuffer put(ByteBuffer src) {    if (src == this)        throw new IllegalArgumentException();    int n = src.remaining();    if (n > remaining())        throw new BufferOverflowException();    for (int i = 0; i < n; i++)        put(src.get());    return this;}public ByteBuffer put(byte[] src, int offset, int length) {    checkBounds(offset, length, src.length);    if (length > remaining())        throw new BufferOverflowException();    int end = offset + length;    for (int i = offset; i < end; i++)        this.put(src[i]);    return this;}public final ByteBuffer put(byte[] src) {    return put(src, 0, src.length);}// -- Other stuff --/** * Tells whether or not this buffer is backed by an accessible byte array. * * 

If this method returns true then the {[@link](https://my.oschina.net/u/393) #array() array} * and {[@link](https://my.oschina.net/u/393) #arrayOffset() arrayOffset} methods may safely be invoked. *

* * [@return](https://my.oschina.net/u/556800) true if, and only if, this buffer * is backed by an array and is not read-only */public final boolean hasArray() { return (hb != null) && !isReadOnly;}/** * Returns the byte array that backs this * buffer (optional operation). * *

Modifications to this buffer's content will cause the returned * array's content to be modified, and vice versa. * *

Invoke the {[@link](https://my.oschina.net/u/393) #hasArray hasArray} method before invoking this * method in order to ensure that this buffer has an accessible backing * array.

* * [@return](https://my.oschina.net/u/556800) The array that backs this buffer * * @throws ReadOnlyBufferException * If this buffer is backed by an array but is read-only * * @throws UnsupportedOperationException * If this buffer is not backed by an accessible array */public final byte[] array() { if (hb == null) throw new UnsupportedOperationException(); if (isReadOnly) throw new ReadOnlyBufferException(); return hb;}/** * Returns the offset within this buffer's backing array of the first * element of the buffer (optional operation). * *

If this buffer is backed by an array then buffer position p * corresponds to array index p + arrayOffset(). * *

Invoke the {@link #hasArray hasArray} method before invoking this * method in order to ensure that this buffer has an accessible backing * array.

* * @return The offset within this buffer's array * of the first element of the buffer * * @throws ReadOnlyBufferException * If this buffer is backed by an array but is read-only * * @throws UnsupportedOperationException * If this buffer is not backed by an accessible array */public final int arrayOffset() { if (hb == null) throw new UnsupportedOperationException(); if (isReadOnly) throw new ReadOnlyBufferException(); return offset;}/** * Compacts this buffer. 压缩并整理Buffer。 * * The bytes between the buffer's current position and its limit, if any, are copied to the beginning of the buffer. * That is, the byte at index p=position() is copied to index zero, * the byte at index p+1 is copied to index one, * and so forth until the byte at index limit()-1 is copied to index n=limit()-1-p * The buffer's position is then set to n+1 and its limit is set to its capacity. The mark, if defined, is discarded. * * 即:将所有未读的数据拷贝到Buffer的起始处,然后将position设到最后一个未读元素的后面 * limit设置为capacity,此时,如果向Buffer中写数据,则不会覆盖之前未读的数据! * 与clear()方法的比较: * 如果Buffer中存在未读的数据,调用clear()方法后,这些未读的数据将会被"遗忘",因为在clear之后,position的值为0,故无法确定未读数据的位置。 */public abstract ByteBuffer compact();/** * Tells whether or not this byte buffer is direct.

*/public abstract boolean isDirect();public String toString() { StringBuffer sb = new StringBuffer(); sb.append(getClass().getName()); sb.append("[pos="); sb.append(position()); sb.append(" lim="); sb.append(limit()); sb.append(" cap="); sb.append(capacity()); sb.append("]"); return sb.toString();}/** * Returns the current hash code of this buffer. */public int hashCode() { int h = 1; int p = position(); for (int i = limit() - 1; i >= p; i--) h = 31 * h + (int)get(i); return h;}/** * Tells whether or not this buffer is equal to another object. * * They have the same element type, * They have the same number of remaining elements, * and The two sequences of remaining elements, * considered independently of their starting positions, are pointwise equal. * * 即:Buffer中元素的类型相同,并且剩余的元素完全相同,则返回true * 注意:并不是比较Buffer的所有数据,只是比较Buffer中的剩余数据。 */public boolean equals(Object ob) { if (this == ob) return true; if (!(ob instanceof ByteBuffer)) return false; ByteBuffer that = (ByteBuffer)ob; if (this.remaining() != that.remaining()) return false; int p = this.position(); for (int i = this.limit() - 1, j = that.limit() - 1; i >= p; i--, j--) if (!equals(this.get(i), that.get(j))) return false; return true;}private static boolean equals(byte x, byte y) { return x == y;}/** * Compares this buffer to another. * * 比较两个Buffer的剩余元素 * 一个Buffer"小于"另一个Buffer的场景: * 第一个不相等的元素小于另一个Buffer中对应的元素 * 所有元素都相等,但是第一个Buffer的元素个数小于另一个Buffer的个数 */public int compareTo(ByteBuffer that) { int n = this.position() + Math.min(this.remaining(), that.remaining()); for (int i = this.position(), j = that.position(); i < n; i++, j++) { int cmp = compare(this.get(i), that.get(j)); if (cmp != 0) return cmp; } return this.remaining() - that.remaining();}private static int compare(byte x, byte y) { return Byte.compare(x, y);}// -- Other char stuff --// -- Other byte stuff: Access to binary data --boolean bigEndian = true; // package-private boolean nativeByteOrder = (Bits.byteOrder() == ByteOrder.BIG_ENDIAN); // package-private /** * Retrieves this buffer's byte order. * *

The byte order is used when reading or writing multibyte values, and * when creating buffers that are views of this byte buffer. The order of * a newly-created byte buffer is always {@link ByteOrder#BIG_ENDIAN * BIG_ENDIAN}.

* * @return This buffer's byte order */public final ByteOrder order() { return bigEndian ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN;}/** * Modifies this buffer's byte order.

* * @param bo * The new byte order, * either {@link ByteOrder#BIG_ENDIAN BIG_ENDIAN} * or {@link ByteOrder#LITTLE_ENDIAN LITTLE_ENDIAN} * * @return This buffer */public final ByteBuffer order(ByteOrder bo) { bigEndian = (bo == ByteOrder.BIG_ENDIAN); nativeByteOrder = (bigEndian == (Bits.byteOrder() == ByteOrder.BIG_ENDIAN)); return this;}// Unchecked accessors, for use by ByteBufferAs-X-Buffer classes//abstract byte _get(int i); // package-privateabstract void _put(int i, byte b); // package-private/** * Relative get method for reading an int value. * *

Reads the next four bytes at this buffer's current position, * composing them into an int value according to the current byte order, * and then increments the position by four.

* * @return The int value at the buffer's current position * * @throws BufferUnderflowException * If there are fewer than four bytes * remaining in this buffer */public abstract int getInt();/** * Relative put method for writing an int * value (optional operation). * *

Writes four bytes containing the given int value, in the * current byte order, into this buffer at the current position, and then * increments the position by four.

* * @param value * The int value to be written * * @return This buffer * * @throws BufferOverflowException * If there are fewer than four bytes * remaining in this buffer * * @throws ReadOnlyBufferException * If this buffer is read-only */public abstract ByteBuffer putInt(int value);/** * Absolute get method for reading an int value. * *

Reads four bytes at the given index, composing them into a * int value according to the current byte order.

* * @param index * The index from which the bytes will be read * * @return The int value at the given index * * @throws IndexOutOfBoundsException * If index is negative * or not smaller than the buffer's limit, * minus three */public abstract int getInt(int index);/** * Absolute put method for writing an int * value (optional operation). * *

Writes four bytes containing the given int value, in the * current byte order, into this buffer at the given index.

* * @param index * The index at which the bytes will be written * * @param value * The int value to be written * * @return This buffer * * @throws IndexOutOfBoundsException * If index is negative * or not smaller than the buffer's limit, * minus three * * @throws ReadOnlyBufferException * If this buffer is read-only */public abstract ByteBuffer putInt(int index, int value);/** * Creates a view of this byte buffer as an int buffer. * *

The content of the new buffer will start at this buffer's current * position. Changes to this buffer's content will be visible in the new * buffer, and vice versa; the two buffers' position, limit, and mark * values will be independent. * *

The new buffer's position will be zero, its capacity and its limit * will be the number of bytes remaining in this buffer divided by * four, and its mark will be undefined. The new buffer will be direct * if, and only if, this buffer is direct, and it will be read-only if, and * only if, this buffer is read-only.

* * @return A new int buffer */public abstract IntBuffer asIntBuffer();// ...

}

"java.nio.ByteBuffer源码是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

元素 数据 剩余 源码 相同 个数 内容 容量 对象 方法 更多 知识 实用 学有所成 接下来 两个 位置 只是 困境 场景 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 山东特亿宝互联网科技有限公司 北京互联网科技 腾讯科技 互联网女皇 互联网金融科技平台 西安互联网科技公司 随着互联网科技发展 顶级互联网科技成果有哪些 互联网校园科技培训 厦门比较好的科技互联网公司 互联网科技研发水平 产业互联网科技服务公司 上海创道互联网络科技有限公司 2021世界互联网领先科技成果发布 互联网科技接地气 互联网界的黑科技 云南互联网科技学费 兰石爱特工业互联网科技分公司 广州三三互联网科技有限公司 现代科技的标志之一的互联网 如何强化互联网金融科技 互联网科技小贷 互联网科技论文 华中科技大学互联网 互联网系的金融科技公司 全球顶尖互联网科技公司 上海京穆互联网科技有限公司 伍佰万互联网科技怎么赚钱 湖北辰鑫科技互联网 现代科技的标志之一的互联网 株洲百竞科技的互联网营销顾问
0