JavaNIO缓冲区

package com.nio.test;

import java.nio.ByteBuffer;

import org.junit.Test;

/**
 *
 * @author fliay
 *
 *	一、缓冲区(buffer)
 *	根据数据类型不同(boolean)除外,提供了相应类型的缓冲区;
 *	ByteBuffer
 *	CharBuffer
 *	ShortBuffer
 *	IntBuffer
 *	LongBuffer
 *	FloatBuffer
 *	BoubleBuffer
 *	上述缓冲区的管理方式几乎一致,通过allocate() 获取缓冲区
 *
 *	二、缓冲区存取数据的两个核心方法:
 *		1.put(): 存入数据到缓冲区中
 *		2.get(): 获取缓冲区中的数据
 *
 *	三、缓冲区中的四个核心属性:
 *		1.capacity: 容量,表示缓冲区最大存储数据的容量。
 *		2.limit:	界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)
 *		3.position:	位置,表示缓冲区中正在操作数据的位置。
 *		4.mark:		标记,表示记录当前position的位置,可以通过reset() 恢复到mark的位置
 *
 *
 *		0 <= mark <= position <= limit <= capacity
 *
 */

public class TestBuffer {

	@Test
	public void test1(){

		String str = "abcde";
		//1.分配一个指定大小的缓冲区
		ByteBuffer buf = ByteBuffer.allocate(1024);

		System.out.println("------------------allocate(分配指定大小的缓冲区)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());

		//2.利用put() 存入数据到缓冲区
		buf.put(str.getBytes());

		System.out.println("------------------put(存入数据到缓冲区)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());

		//3.切换读取数据数据模式
		buf.flip();

		System.out.println("------------------flip(切换读取数据模式)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());

		//4.利用get() 读取缓冲区中的数据
		System.out.println("------------------get读取缓冲区中的数据-------------------");
		byte[]	s = new byte[buf.limit()];
		buf.get(s);
		System.out.println("读取缓冲区中的数据:"+new String(s,0,s.length));

		System.out.println("------------------get(读取缓冲区中的数据)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());

		//5.rewind()可重复读
		buf.rewind();
		System.out.println("------------------rewind(重置可操作数据/可重复读)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());

		//6.clear() 清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态
		buf.clear();
		System.out.println("------------------clear(清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态)-------------------");
		System.out.println("position(正在操作数据位置):"+buf.position());
		System.out.println("limit(可以操作数据的大小):"+buf.limit());
		System.out.println("capacity(最大存储数据容量):"+buf.capacity());

	}

	@Test
	public void test2(){
		String str="abcde";
		ByteBuffer buf = ByteBuffer.allocate(1024);
		buf.put(str.getBytes());
		buf.flip();
		byte[] b = new byte[buf.limit()];
		buf.get(b,0,2);
		System.out.println(new String(b,0,2));
		System.out.println(buf.position());
		//mark()标记
		buf.mark();
		System.out.println("------------------mark 标记后-------------------");
		buf.get(b, 2, 2);
		System.out.println(new String(b,2,2));
		System.out.println(buf.position());

		System.out.println("------------------reset 恢复到mark的位置-------------------");
		//reset 恢复到mark的位置
		buf.reset();
		System.out.println(buf.position());
		//判断缓冲区中是否还有剩余数据
		if(buf.hasRemaining()){
			System.out.println("------------------获取缓冲区中所有剩余数据-------------------");
			System.out.println(buf.remaining());

			System.out.println("缓冲区中的剩余数据:"+new String(b,buf.position(),buf.remaining()));
		}

	}

}

  输出结果

------------------allocate(分配指定大小的缓冲区)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):1024
capacity(最大存储数据容量):1024
------------------put(存入数据到缓冲区)-------------------
position(正在操作数据位置):5
limit(可以操作数据的大小):1024
capacity(最大存储数据容量):1024
------------------flip(切换读取数据模式)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):5
capacity(最大存储数据容量):1024
------------------get读取缓冲区中的数据-------------------
读取缓冲区中的数据:abcde
------------------get(读取缓冲区中的数据)-------------------
position(正在操作数据位置):5
limit(可以操作数据的大小):5
capacity(最大存储数据容量):1024
------------------rewind(重置可操作数据/可重复读)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):5
capacity(最大存储数据容量):1024
------------------clear(清空缓冲区 但是缓冲区中的数据依然存在,但是是出于“被遗忘”状态)-------------------
position(正在操作数据位置):0
limit(可以操作数据的大小):1024
capacity(最大存储数据容量):1024
ab
2
------------------mark 标记后-------------------
cd
4
------------------reset 恢复到mark的位置-------------------
2
------------------获取缓冲区中所有剩余数据-------------------
3
缓冲区中的剩余数据:cd

  

时间: 2024-10-20 19:08:38

JavaNIO缓冲区的相关文章

Java-NIO(二):缓冲区(Buffer)的数据存取

缓冲区(Buffer): 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道读入到缓冲区,从缓冲区写入通道中的. Buffer就像一个数组,可以保存多个相同类型的数据.根据类型不同(boolean除外),有以下Buffer常用子类: ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer Dou

Java-NIO(三):直接缓冲区与非直接缓冲区

直接缓冲区与非直接缓冲区的概念: 1)非直接缓冲区:通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的一个本机IO之前或者之后,虚拟机都会将缓冲区的内容复制到中间缓冲区(或者从中间缓冲区复制内容),缓冲区的内容驻留在JVM内,因此销毁容易,但是占用JVM内存开销,处理过程中有复制操作. 非直接缓冲区写入步骤: 1.创建一个临时的直接ByteBuffer对象.2.将非直接缓冲区的内容复制到临时缓冲中.

JavaNIO(一)(IO基本概念扫盲篇)

一.基本IO概念 1.什么是流IO? 1.1 基本概念 流是一种抽象概念,它代表了数据的无 结构化传递. 按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而 向流中添加数据的操作称为插入操作.用来进行输入输出操作的流就称为IO流.换句话说,IO流就是以流的方式进行输入输出.输入输出(IO)是指计算机同 任何外部设备之间的数据传递.常见的输入输出设备有文件.键盘.打印机.屏幕等.数据可以按记录(或称数据块)的方式传递,也可以流的方式传递. 1.2 形

javaNIO原理(含代码)及与 同步阻塞IO 、伪异步IO比较

一.同步阻塞IO BIO就是阻塞式的IO,网络通信中对于多客户端的连入,服务器端总是与客户端数量一致的线程去处理每个客户端任务,即,客户端与线程数1:1,并且进行读写操作室阻塞的,当有你成千上完的客户端进行连接,就导致服务器不断的建立新的线程,最后导致低通资源不足,后面的客户端不能连接服务器,并且连接入的客户端并不是总是在于服务器进行交互,很可能就只是占用着资源而已. 二.伪异步IO 伪异步IO对同步IO进行了优化,后端通过一个线程池和任务队列去处理所有客户端的请求,当用完后在归还给线程池,线程

javaNIO(转载)

(一) Java NIO 概述 Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API.其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类.因此,在概述中我将集中在这三个组件上.其它组 件会在单独的章节中讲到. Channel 和 Buffer 基本上,所有的 IO 在NIO 中都从一个Chan

JavaNio 基础教程

转自http://www.iteye.com/magazines/132-Java-NIO?page=2#586 Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.本系列教程将有助于你学习和理解Java NIO. Java NIO提供了与标准IO不同的IO工作方式:? Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffe

JavaNIO中的内存映射io

客户端代码: package cc.client; import java.io.*; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.*; public class ClientOper { public static void main(String[] args) throws IOExcepti

Java NIO中的缓冲区Buffer(一)缓冲区基础

什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的源码),Buffer类内部其实就是一个基本数据类型的数组,以及对这个缓冲数组的各种操作: 常见的缓冲区如ByteBuffer.IntBuffer.DoubleBuffer...内部对应的数组依次是byte.int.double... 与通道的关系 在Java NIO中,缓冲区主要是跟通道(Chann

字符串缓冲区

StringBuffer字符串缓冲区 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符. 特点: 1:可以对字符串内容进行修改. 2:是一个容器. 3:是可变长度的. 4:缓冲区中可以存储任意类型的数据. 5:最终需要变成字符串. 容器通常具备一些固定的方法: 1,添加. StringBuffer append(data):在缓冲区中追加数据.追加到尾部. StringBuffer insert(index,data):在指定位置插入数据. 2,删除. StringBuffer de