NIO(缓冲区一)

100 阅读2分钟
  • 字节存储数据:window是大端存储,mac是小端存储
    • 大端存储逻辑,数据为顺序存储
    • 小端存储逻辑,数据为逆序存储

image.png image.png

  • 网络传输规则
    • 网络传输协议规定,所有的IP数据传输都要使用大端数据来传输,如果非大端数据,那么在本地将数据转化为大端数据后再发送。在NIO中字节顺序由ByteOrder类封装
package java.nio;
public final class ByteOrder { 
//这里定义了一个大端,一个小端
public static final ByteOrder BIG_ENDIAN;
public static final ByteOrder LITTLE_ENDIAN;
public static ByteOrder nativeOrder( ) 
//至于当前操作系统所用的的存储逻辑是大端还是小端,调用这个同String方法可以看到
public String toString( )
}

- 直接缓冲区

- 操作系统在内存中进行I/O操作,操作的基本单元是字节,或者说字节数组,在Java中数组为对象,所以引入了直接缓冲区.直接缓冲区被用于DMA通道和I/O交互,使用固定的代码来告诉操作系统释放内存还是填充内存区域.
- 直接缓冲区和非直接缓冲区
    - 字节缓冲区和其他缓冲区最大的区别在于,他们可以成为通道执行的I/O的源头或者目标。其实发现通道直接收ByteBuffer作为参数将这个Channel的时候会发现。
    - 直接缓冲区是通常I/O操作最好的选择。在设计方面,他们支持JVM可用做高效的I/O机制。非直接字节缓冲区可以被传递给通道,但是这样会导致性能损耗.通常非直接缓冲不可能成为一个本地的I/O操作的目标,如果向一个通道传递一个非直接ByteBuffer对象用于写入。通道可能执行以下的操作
            - 1.创建一个临时的直接ByteBuffer对象。
            - 2.将非直接缓冲区的内容复制到临时缓存中。
            - 3.使用临时缓冲区执行低层次I/O操作。
            - 4.临时缓冲区对象离开作用域,被回收.
    
public abstract class ByteBuffer extends Buffer implements Comparable { 
// This is a partial API listing 
public static ByteBuffer allocate(int capacity);
public static ByteBuffer allocateDirect(int capacity);
public abstract boolean isDirect(); }

image.png 直接缓冲区

image.png 非直接缓冲区

image.png