nio和缓存IObuffer的使用
Posted 健康平安的活着
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nio和缓存IObuffer的使用相关的知识,希望对你有一定的参考价值。
一 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);
}
}
以上是关于nio和缓存IObuffer的使用的主要内容,如果未能解决你的问题,请参考以下文章
Android获取各个应用程序的缓存文件代码小片段(使用AIDL)
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题