【Java NIO】之 Buffer

╰半橙微兮° 2023-02-23 05:15 148阅读 0赞

下面以一个实例介绍 NIO 的 Buffer


  1. /** * 一、缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据 * * 根据数据类型不同(boolean 除外),提供了相应类型的缓冲区: * ByteBuffer * CharBuffer * ShortBuffer * IntBuffer * LongBuffer * FloatBuffer * DoubleBuffer * * 上述缓冲区的管理方式几乎一致,通过 allocate() 获取缓冲区 * * 二、缓冲区存取数据的两个核心方法: * put() : 存入数据到缓冲区中 * get() : 获取缓冲区中的数据 * * 三、缓冲区中的四个核心属性: * capacity : 容量,表示缓冲区中最大存储数据的容量。一旦声明不能改变。 * limit : 界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写) * position : 位置,表示缓冲区中正在操作数据的位置。 * * mark : 标记,表示记录当前 position 的位置。可以通过 reset() 恢复到 mark 的位置 * * 0 <= mark <= position <= limit <= capacity * * 四、直接缓冲区与非直接缓冲区: * 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中 * 直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率 */
  2. public class TestBuffer {
  3. @Test
  4. public void testBuffer() {
  5. // 分配指定大小的缓冲区
  6. ByteBuffer buffer = ByteBuffer.allocate(1024);
  7. System.out.println("----------------- allocate ---------------");
  8. System.out.println("position" + " : " + buffer.position());
  9. System.out.println("limit" + " : " + buffer.limit());
  10. System.out.println("capacity" + " : " + buffer.capacity());
  11. // 使用 put() 方法把数据存入缓冲区
  12. buffer.put("abcdefgh".getBytes());
  13. System.out.println("----------------- put ---------------");
  14. System.out.println("position" + " : " + buffer.position());
  15. System.out.println("limit" + " : " + buffer.limit());
  16. System.out.println("capacity" + " : " + buffer.capacity());
  17. // 切换到读模式
  18. buffer.flip();
  19. System.out.println("----------------- flip ---------------");
  20. System.out.println("position" + " : " + buffer.position());
  21. System.out.println("limit" + " : " + buffer.limit());
  22. System.out.println("capacity" + " : " + buffer.capacity());
  23. // 使用 get() 方法读取缓冲区数据
  24. byte[] bytes = new byte[buffer.limit()];
  25. buffer.get(bytes);
  26. System.out.println("----------------- get ---------------");
  27. System.out.println("data : " + new String(bytes));
  28. System.out.println("position" + " : " + buffer.position());
  29. System.out.println("limit" + " : " + buffer.limit());
  30. System.out.println("capacity" + " : " + buffer.capacity());
  31. // 调用 rewind() 方法实现重复读
  32. buffer.rewind();
  33. System.out.println("----------------- rewind ---------------");
  34. System.out.println("position" + " : " + buffer.position());
  35. System.out.println("limit" + " : " + buffer.limit());
  36. System.out.println("capacity" + " : " + buffer.capacity());
  37. // clear() : 清空缓冲区. 但是缓冲区中的数据依然存在,但是处于“被遗忘”状态
  38. buffer.clear();
  39. System.out.println("----------------- clear ---------------");
  40. System.out.println("position" + " : " + buffer.position());
  41. System.out.println("limit" + " : " + buffer.limit());
  42. System.out.println("capacity" + " : " + buffer.capacity());
  43. System.out.println((char)buffer.get());
  44. }
  45. @Test
  46. public void testDirectBuffer() {
  47. // 分配直接缓冲区
  48. ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
  49. System.out.println(buffer.isDirect());
  50. }
  51. @Test
  52. public void testMark() {
  53. // 分配指定大小的缓冲区
  54. ByteBuffer buffer = ByteBuffer.allocate(1024);
  55. // 使用 put() 方法把数据存入缓冲区
  56. buffer.put("abcdefgh".getBytes());
  57. // 读取数据
  58. buffer.flip();
  59. byte[] bytes = new byte[buffer.limit()];
  60. buffer.get(bytes, 0, 2);
  61. System.out.println("data : " + new String(bytes, 0, 2));
  62. System.out.println("position" + " : " + buffer.position());
  63. // mark() : 标记一下当前 positon 的位置
  64. buffer.mark();
  65. // 继续读取数据
  66. buffer.get(bytes, 2, 2);
  67. System.out.println("data : " + new String(bytes, 2, 2));
  68. System.out.println("position" + " : " + buffer.position());
  69. // reset() : 恢复到 mark 位置
  70. buffer.reset();
  71. System.out.println("--------- after reset --------");
  72. System.out.println("position" + " : " + buffer.position());
  73. // 判断缓冲区是否有剩余可操作数据,即:position < limit
  74. if (buffer.hasRemaining()) {
  75. System.out.println(buffer.remaining());
  76. }
  77. }
  78. }

发表评论

表情:
评论列表 (有 0 条评论,148人围观)

还没有评论,来说两句吧...

相关阅读

    相关 NIOBuffer

    Buffer 其实在Buffer中官方的javadoc中已经讲得非常清楚了,本篇博客是本人做为笔记使用。 下面是我截取的javadoc很详细的介绍了关于mark,po

    相关 NIOBuffer

    在上一篇文章中聊了一下[Channel][],这篇文章聊一下Java NIO中的另一个重要的组件:`Buffer`。 Buffer的概念 首先我们先看一下`Buffer

    相关 NIOBuffer channel

    java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。 通道可以异步地读写。 通道中的数据总是要先读到一个Buffe

    相关 Java NIOBuffer

    缓冲区基础 本质上,缓冲区是就是一个数组。所有的缓冲区都具有四个属性来提供关于其所包含的数组的信息。它们是: 容量(Capacity) 缓冲区能够容纳的数据元素的

    相关 NIOBuffer

    > Java NIO中的Buffer用于和NIO通道进行交互。数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内

    相关 java NIObuffer

    Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内