zl程序教程

您现在的位置是:首页 >  后端

当前栏目

nio和缓存IObuffer的使用

nio缓存 使用
2023-09-27 14:22:12 时间

一 NIO的概念

1.1 NIO的概念

Nio:即非阻塞I/O, 也就 java new io。

同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理

Sun官方标榜的特性如下:
1、 为所有的原始类型提供(buffer)缓存支持。
2、 字符集编码解码解决方案。
3、 Channel:一个新的原始I/O抽象。
4、 支持锁和内存映射文件的文件访问接口。
5、 提供多路(non-bloking)非阻塞式的高伸缩性网络I/O。
对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性; 对于高负载、高并发的(网络)应用,应使用NIO的非阻塞模式来开发。

1.2 块与流

原来的I/O以流的方式处理数据,而NIO是以块的方式处理数据。

二 缓存的概念

2.1 缓存的概念

 2.2 缓存的类型

2.3 缓存的使用方法

flip方法就是将写模式改为读模式

 

 

 2.4 floop的使用案例

 2.4 floop的使用案例

package com.bonc.mina.server.Test;

import com.bonc.mina.server.udp.coder.CustomPack;
import org.apache.mina.core.buffer.IoBuffer;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @ClassName: BufferTest
 * @Description: TODO
 * @Author: liujianfu
 * @Date: 2021/08/05 11:08:16 
 * @Version: V1.0
 **/
public class BufferTest {
    public static void main(String[] args) throws IOException {
        getFile();
    }
    public static void getFile() throws IOException {
        // E:\New\sts-4.2.0.RELEASE\license.txt
        RandomAccessFile file = new RandomAccessFile("d:/testbuffer.txt", "rw");
        FileChannel fileChannel = file.getChannel();
        ByteBuffer buf = ByteBuffer.allocate(1024);
        System.out.println("buffer:"+buf);
        int read = fileChannel.read(buf);
        while (read != -1) {
          System.out.println("buffer:"+buf);
            buf.flip();
            System.out.println("buffer:"+buf);
            while(buf.hasRemaining()) {
                System.out.println((char)buf.get());
            }

            buf.clear();
            System.out.println("buffer:"+buf);
            read = fileChannel.read(buf);
            System.out.println("buffer:"+buf);
        }

        file.close();
    }

}

 执行截图:

 

 2.5 字节缓存的获取与设置

    public static void getIntByte(){
        IntBuffer buff = IntBuffer.allocate(10);
        int[] array = new int[] {1,2,3};
        buff = buff.wrap(array);
        for (int a : array) {
            System.out.print(a  + "\t");
        }
        System.out.println("buffer:"  + buff);
        buff.put(0, 5);//在索引0的位置放置5
        System.out.println("buffer:"  + buff);
        System.out.println("buffer[0]:"  + buff.get(0));
        IntBuffer buff2 = buff.duplicate();
        System.out.println("buffer2:"  + buff2);
        System.out.println("buffer2[0]:"  + buff2.get(0));
        System.out.println("buffer2[1]:"  + buff2.get(1));
        System.out.println("buffer2[2]:"  + buff2.get(2));
    }

2.6 案例3

 public static void getDuplicate(){
        IntBuffer buff = IntBuffer.allocate(10);
        buff.put(1); // position 0->1
 	System.out.println("buffer:"  + buff);
 	buff.put(2);
		System.out.println("buffer:"  + buff);
        buff.put(3);
        System.out.println("buffer:"  + buff);

	System.out.println("buff.capacity() :"  + buff.capacity());
	System.out.println("buff.limit():"  + buff.limit());

        buff.flip(); // flip方法的作用: limit = position, position = 0;
        System.out.println("buff.capacity() :"  + buff.capacity());
        System.out.println("buff.limit():"  + buff.limit());
        for (int i = 0; i < buff.limit(); i++) {
            System.out.println("buffer get():"  + buff.get()); // position + 1
            System.out.println("buffer :"  + buff);
        }
    }