JAVA NIO(二)基础 内存管理 文件锁定 Socket服务器客户端通信

NIO简介

nio的包主要有四个,分别是

1. 缓冲区包:java.nio 出现版本:Java SE1.4

2.通道包:java.nio.channels 出现版本:Java SE1.4

3.字符集包:java.nio.charset出现版本:Java SE1.4

4.文件处理包:java nio.file 出现版本:Java SE1.7

a)通道数据的进出,都要经过缓冲区

b)通道是一种新的原生I/O抽象概念,好比连接两端数据的管道,用于数据的交互

c)字符集包:大多数字符集的集合,处理字节字符之间相互转换

d)文件包:处理目录和文件。包含io中File类功能,比之更加强大,更具有名字等价的意义

1.缓冲Buffer

会用到CharBuffer

Buffer基础

有几个标志位,用于操作缓冲区

容量(capacity):缓冲区大小(byte),读出、写入值都不会变 位置(position):下一个字节被读出写入的位置,注意:position永远小于limit 界限(limit) :写入时(界限=容量),读出时(上次写入时position的位置) 标记(mark) :初始化为-1,调用reset()可回到标记位置

public static void main(String[] args) {// 初始方法化一:直接用包装的数组作为缓冲区,不再分配空间ByteBuffer temp = ByteBuffer.wrap("字节数组".getBytes());// 初始方法化二,初始化一个容量大小为10的 缓冲区。注意: 初始化时,为写入状态ByteBuffer bb = ByteBuffer.allocate(10);bb.capacity();// 容量:10bb.position();// 位置:0bb.limit();// 界限:10// 写入字节bb.put("345".getBytes());// position = 3// 倒回 执行position = 0 ; mark = -1bb.rewind();// 写入字节bb.put("012".getBytes());// position = 3// 做个标记(mark)bb.mark();// mark = position = 3;// 继续写入bb.put("678".getBytes());// position = 6// 重置:回到记号处bb.reset();// position = mark = 3// 继续写入bb.put("345".getBytes());// position = 6// 切换到写入状态,调用下面方法bb.flip();// 执行:limit = position = 6 ; position = 0 ; mark = -1;// position=0 可以从头开始读出数据。因为bb中只有6个字节,所以被设置读出的界限为6//剩下可读取的字节数bb.remaining();while (bb.hasRemaining()) {// 是否还有没有读取的字节// 读出1个字节bb.get();}// position = 6// 继续从头读bb.rewind();// position = 0// 设置position = 3bb.position(3);System.out.println((char) bb.get()); // 输出3// 包含索引的get(),不会改变position的值System.out.println((char) bb.get(1)); // 输出1// position = 4// 创建一个只读的缓冲区,两个缓冲区共享数据元素ByteBuffer readOnly = bb.asReadOnlyBuffer();// 复制一个缓冲区,两个缓冲共享数据元素,有各自的位置、标记等。// 如果原始的缓冲区为只读,或者为直接缓冲区,新的缓冲区将继承这些属性ByteBuffer duplicate = bb.duplicate();// 创建一个从原始缓冲区的当前位置开始的新缓冲区// 其容量是原始缓冲区的剩余元素数量(limit-position)ByteBuffer slice = bb.slice();// 判断缓冲区是否是只读readOnly.isReadOnly(); // true// 切换到写入状态bb.clear();// position = 0 ; limit=10}

public static void main(String[] args) {ByteBuffer bb = ByteBuffer.allocate(20);// 以下都是ByteBuffer的视图缓冲器CharBuffer cb = bb.asCharBuffer();DoubleBuffer db = bb.asDoubleBuffer();FloatBuffer fb = bb.asFloatBuffer();IntBuffer ib = bb.asIntBuffer();LongBuffer lb = bb.asLongBuffer();ShortBuffer sb = bb.asShortBuffer();// ByteBuffer 大小20个字节,刚好容下5个int类型int[] is = new int[] { 1, 2, 3, 4, 5 };bb.asIntBuffer().put(is);// 不同的机器可能使用不同的字节排序方法来存储数据,ByteBuffer以高位优先的形式存储数据// “big endian” 高位优先// “little endian”低位优先System.out.println(Arrays.toString(bb.array()));// 输出[0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5]//查看缓冲区的当前字节顺序设定bb.order();//设置bb以地位优先存储数据bb.order(ByteOrder.LITTLE_ENDIAN);//不调用clear()是因为asIntBuffer()会生成一个新的int缓冲,与bb共享数据元素bb.asIntBuffer().put(is);System.out.println(Arrays.toString(bb.array()));//输出:[1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0]}

间接缓冲区:征服畏惧、建立自信的最快最确实的方法,

JAVA NIO(二)基础 内存管理 文件锁定 Socket服务器客户端通信

相关文章:

你感兴趣的文章:

标签云: