Java NIO之ByteBuffer使用记录

最近在做一个业余项目,期望在项目中学习Java语言,在这个过程中遇到了ByteBuffer,感觉在这个项目中是一个很重要很基础的一个东西,所以借这个机会学习了一下,以此为记。

 

flapmmo-20140225\src\main\java\org\javaee7\websocket\flapmmo\FlapEndpoint.java

package org.javaee7.websocket.flapmmo;

import java.io.IOException;
import java.nio.ByteBuffer;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.OnClose;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/websocket")
public class FlapEndpoint {
    @OnMessage
    public void onMessage(ByteBuffer data, Session session) throws IOException {
        //System.out.println("echoBinary: " + data);
        for (byte b : data.array()) {
            System.out.print(Integer.toHexString(b & 0xFF).toUpperCase() + " ");
        }
        System.out.println(" ");
        ByteBuffer bb = ByteBuffer.allocate(256);
        bb.put((byte)0);
        bb.putInt(0x12345678);
        session.getBasicRemote().sendBinary(bb);
    }
    @OnOpen
    public void onOpen () {
        System.out.println("Client connected");
    }
    @OnClose
    public void onClose () {
        System.out.println("Connection closed");
    }
}


 

代码逻辑:

当浏览器端向WebSocket服务器发送数据,onMessage方法将会执行,数据以字节缓冲区的形式保存在参数data中。服务器收到数据,调用onMessage方法,将数据以十六进制的形式打印出来,并创建一个新的字节缓冲区bb,在bb中填充要发送的数据,并将数据发送给浏览器端。

 

http://docs.oracle.com/javase/7/docs/api/

 

java.lang.Object

java.nio.Buffer

java.nio.ByteBuffer

 

 

public abstract class ByteBuffer
extends
Buffer
implements
Comparable<ByteBuffer>

A bytebuffer.

 

 

Modifier and Type

Method and Description

static ByteBuffer   

allocate(int capacity)

Allocates a new byte buffer.

 

byte[]

array()

Returns the byte array that backs this buffer  (optional operation).

abstract ByteBuffer

put(byte b)

Relative put method  (optional operation).

abstract ByteBuffer

putInt(int value)

Relative put method for writing an int value  (optional operation).

 

 

ByteBuffer用法小结

http://blog.csdn.net/mars5337/article/details/6576417

 

在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区.缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型.ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBuffer.因此ByteBuffer的用法是有必要牢固掌握的.

 

1.创建ByteBuffer

1.1 使用allocate()静态方法

    ByteBufferbuffer=ByteBuffer.allocate(256);

    以上方法将创建一个容量为256字节的ByteBuffer,如果发现创建的缓冲区容量太小,唯一的选择就是重新创建一个大小合适的缓冲区.

 

 

学习socketnio 之ByteBuffer

http://blog.csdn.net/maosijunzi/article/details/14127481

 

1:什么是ByteBuffer?

ByteBuffer就是字节缓冲区。

 

2:ByteBuffer是用来干什么的?

顾名思义,它是用来存放字节的。很常用的地方就是程序向网络中传送数据的时候。

 

3:怎么使用ByteBuffer?

要使用ByteBuffer,理解其中3个指针是很重要的:position、limit和capacity

这三个指针的关系是 position<=limit<=capacity

position是当前读写的位置。

limit是最大能读写的位置。

capacity是缓冲区的容量。

 

一段程序:

 1:ByteBufferbuffer = ByteBuffer.allocate(5); position=0,limit=5,capacity=5

 2:buffer.put((byte)1);                        position=1,limit=5,capacity=5

 3:buffer.flip();                              position=0,limit=1,capacity=5

 4:buffer.get();                               position=1,limit=1,capacity=5

 

   第一行:创建一个ByteBuffer,初始化状态下,postion为0,limit=capacity=缓冲区大小

 第二行:往缓冲区放一个字节,position就会往后移动一下,但是不会超过limit。如果超过会报错。

 第三行:flip方法会把limit设为position的值,而position还原为0,为读缓冲区做准备。

 第四行:从缓冲区内读取一个字节,position会往后移动一下,但是不会超过limit,如果超过会报错。

 

 

你可能感兴趣的:(Java NIO之ByteBuffer使用记录)