【Java nio】buffer

  

  1 package com.slp.nio;
  2
  3 import org.junit.Test;
  4
  5 import java.nio.ByteBuffer;
  6
  7 /**
  8  * Created by sanglp on 2017/3/1.
  9  * 一、缓冲区:在Java nio中负责数据的存储。缓冲区就是数据,用于村塾不同数据类型的数据
 10  * 根据数据类型的不同(boolean类型除外),提供了相应类型的缓冲区
 11  * ByteBuffer
 12  * CharBuffer
 13  * ShortBuffer
 14  * IntBuffer
 15  * FloatFuffer
 16  * DoubleBuffer
 17  * 上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区
 18  * 二、缓冲区有存取数据的两个核心方法
 19  * put()存储数据到缓冲区中
 20  * get()获取缓冲区中的数据
 21  * 三、缓冲区的四个核心属性
 22  * capacity:容量,表示缓冲区中最大存储数据的容量,一旦声明就不能改变
 23  * limit:界限   表示缓冲区中可以操作数据的大小 limit后数据不能进行读写
 24  * position:位置 缓冲区中正在操作数据的位置
 25  * mark:标记   表示记录当前position的位置,可以通过reset()或辅导mark的位置
 26  * 0<=mark<=position<=limit<=capacity
 27  *
 28  * 四、直接缓冲区与非直接缓冲区
 29  * 非直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在JVM的内存中
 30  * 直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中
 31  */
 32 public class TestBuffer {
 33
 34     @Test
 35     public void test3(){
 36         ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
 37         System.out.println(buffer.isDirect());//true
 38     }
 39     @Test
 40     public void test2(){
 41         String str="asdfgh";
 42         ByteBuffer  buffer = ByteBuffer.allocate(1024);
 43         buffer.put(str.getBytes());
 44         buffer.flip();
 45         buffer.get(new byte[buffer.limit()],0,2);
 46         System.out.println(new String(new byte[buffer.limit()],0,2));
 47         System.out.println(buffer.position());//2
 48         //标记
 49         buffer.mark();
 50         buffer.get(new byte[buffer.limit()],2,2);
 51         System.out.println(new String(new byte[buffer.limit()],2,2));
 52         System.out.println(buffer.position());//4
 53         //reset()恢复到mark的位置
 54         buffer.reset();
 55         System.out.println(buffer.position());//2
 56         //判断缓冲区中对否有
 57         if(buffer.hasRemaining()){
 58             System.out.println(buffer.remaining());//4
 59         }
 60     }
 61
 62     @org.junit.Test
 63     public void test(){
 64         String str="ABCDE";
 65         //1、分配一个指定大小的缓冲区
 66         ByteBuffer buf = ByteBuffer.allocate(1024);
 67         System.out.println(buf.position());//0
 68         System.out.println(buf.limit());//1024
 69         System.out.println(buf.capacity());//1024
 70        //2、利用put()存入数据到缓冲区
 71         buf.put(str.getBytes());
 72         System.out.println(buf.position());//5
 73         System.out.println(buf.limit());//1024
 74         System.out.println(buf.capacity());//1024
 75         //3、切换为读取数据的模式
 76         buf.flip();
 77         System.out.println(buf.position());//0
 78         System.out.println(buf.limit());//5
 79         System.out.println(buf.capacity());//1024
 80         //4、读取缓冲区中的数据
 81         byte [] dest = new byte[buf.limit()];
 82         buf.get(dest);
 83         System.out.println(new String(dest,0,dest.length));//ABCDE
 84         System.out.println(buf.position());//5
 85         System.out.println(buf.limit());//5
 86         System.out.println(buf.capacity());//1024
 87
 88         //5。rewind()可重复读数据
 89         buf.rewind();
 90         System.out.println(buf.position());//0
 91         System.out.println(buf.limit());//5
 92         System.out.println(buf.capacity());//1024
 93         //6、清空缓冲区 但是缓冲区中的数据依然存在,但是处于被遗忘状态
 94         buf.clear();
 95         System.out.println(buf.position());//0
 96         System.out.println(buf.limit());//1024
 97         System.out.println(buf.capacity());//1024
 98         System.out.println((char)buf.get());//A
 99     }
100 }
时间: 2024-12-31 05:22:04

【Java nio】buffer的相关文章

【JAVA NIO】Channels和Buffers

Channels和Buffers是JAVA NIO里面比较重要的两个概念,NIO正是基于Channels和Buffers进行数据操作,且数据总是从Channels读取到Buffers,或者从Buffers写入到Channels. 通道(Channel) 可以从通道写输入,也可以读数据: 通道的数据是跟Buffer进行交互的,数据可以读到Buffer,也可以从Buffer写数据到通道: 还可以异步读写数据: 以FileChannel为例,如下: FileChannel FileChannel是文件

【Java nio】 NonBlocking NIO

1 package com.slp.nio; 2 3 import org.junit.Test; 4 5 import java.io.IOException; 6 import java.net.InetSocketAddress; 7 import java.nio.ByteBuffer; 8 import java.nio.channels.SelectionKey; 9 import java.nio.channels.Selector; 10 import java.nio.chan

【Java nio】Blocking nio2

package com.slp.nio; import org.junit.Test; import java.io.File; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.ServerSocketChannel; import jav

【Java NIO】

二. 1.通道只是连接作用,缓冲区才是数据存取 三. 1.使用NIO 完成网络通信的三个核心: (1)通道(Channel):负责连接 java.nio.channels.Channel接口: |--SelectableChannel |--SocketChannel |--ServerSocketChannel |--DatagramChannel |--Pipe.SinkChannel |--Pipe.SourceChannel (2)缓冲区(Buffer):负责数据的存取 (3)选择器(S

【Java NIO】系统基础

系统硬件 CPU - 中央处理单元 ALU - 算术逻辑单元 PC - 程序计数器 USB - 通用串行总线 总线 总线,贯穿整个系统的一组电子管道,在各个部件间传递字节流信息. 传送定长的字节块,称为字:字中的字节数,称为字长. 处理器 CPU,中央处理单元,是解释/执行存储在主存中指令的引擎. PC,程序计数器,在任何时间点上,都指向主存中某条机器语言指令(内含其地址). 寄存器文件,存储设备,CPU的核心.它是一个小的存储设备,由一些字长大小的寄存器组成,这些寄存器每个都有唯一的名字. A

【Java记录】try-with-resources的一个坑

[Java记录]try-with-resources的一个坑 今天处理 AsynchronousFileChannel 时候的一个问题,代码如下: public static void main(String[] args) throws Exception { String filePath = "/home/xe/git/osc/JavaNote/Lang/data/Test.java"; ExecutorService executorService = Executors.ne

【java解惑】前缀自增自减和后缀自增自减问题

    如下代码: public class Example025 { public static void main(String[] args) { int ape = 100; int it = 100; int ape_it = 100; for (int i = 0; i < 100; i++) { ape--; it = it--; ape_it = --ape_it; } System.out.println("ape = " + ape); System.out.

【java web】java执行预编译Groovy脚本

在JVM中运行Groovy类有两种方式: 使用Groovy编译所有的*.groovy为java的*.class文件,把这些*.class文件放在java类路径中,通过java类加载器来加载这些类. 通过groovy类加载器在运行时直接加载*.groovy文件并生成对象.在这种方式下,没有生成任何*.class,但是生成了一个java.lang.Class对象的实例. 下面介绍前一种使用Groovy的方法:编译成java字节码并且作为正常java应用程序运行在java虚拟机上,即预编译模式. 1.

【java解惑】重载构造函数

如下所示代码: public class Example046 { private Example046(Object o) { System.out.println("Object"); } private Example046(double[] dArray) {//2 System.out.println("double array"); } private Example046(String str) {//3 System.out.println(&quo