Java NIO缓冲
缓冲区(buffer)是从即将写入通道(channel)或刚刚从通道中读出的一段数据。它是一个持有数据,并扮演NIO通道端点的对象。缓冲区为数据访问和读写过程提供正式机制。
它是NIO和老版Java I/O的一个主要区别。之前数据是直接从流(stream)中读写的,现在数据可以从缓冲区读写。在NIO中,通道是流的同义词。想要了解更多关于NIO通道的信息, 请阅读上一篇教程Java NIO通道。
NIO缓冲区特征
- Java NIO的基本组成模块就是缓冲区。
- 缓冲区提供一个固定大小的容器来读取数据。
- 每个缓冲区都是可读的,但只有特定缓冲区才是可写的。
- 缓冲区是通道的端点。
- 只读缓冲区的内容是不可变的,但是其mark、position和limit都是可变的。
- 默认情况下,缓冲区都不是线程安全的。
缓冲区类型
每种原始类型都有一个对应的缓冲区类型。所有的缓冲区类都实现了Buffer接口。最常用的缓冲区类型是ByteBuffer。如下是Java NIO包中提供的缓冲区类型。
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- MappedByteBuffer
缓冲区容量
缓冲区有固定大小,我们只能存储少于“固定大小”的数据,固定大小的值就叫做缓冲区的容量。缓冲区一旦填满则必须清空才能再次写入。容量一旦设置好,在缓存区的生命周期内都不会改变。
缓冲区界限
在写入模式,缓冲区的界限就等于容量。在读模式中,界限指向缓冲区最后一个数据位的下一位。当缓冲区被写入时,界限一直递增。缓冲区的界限永远大于等于零且小于等于容量,0 <= 界限 <= 容量。
缓冲区位置
位置指向缓冲区当前地址。当缓冲区创建时,位置设置为零。读写过程中,位置会递增到下一个索引位置。位置永远在零和界限之间。
缓冲区标记
标记类似于给缓冲区设置书签。调用 mark() 时当前位置就被记录下来了,调用 reset() 时标记的位置就被恢复。
缓冲区flip、clear和rewind
缓冲区flip()
flip() 方法用来为缓冲区做准备,进行 get 操作或者准备新的写入序列。flip() 将界限设置到当前位置,然后将位置置为0。
缓冲区clear()
clear() 方法用来为缓冲区做准备,进行 put 操作或者准备新的读序列。clear() 将界限设置到容量的位置,并将位置置为0。
缓冲区rewind()
rewind() 方法用来再次读取已经获取过的数据。rewind()将缓冲区位置置0。
如何读NIO缓冲区
- 首先创建缓冲区,分配容量。Buffer有一个 allocate(size) 方法,可以返回一个 Buffer 对象。ByteBuffer byteBuffer = ByteBuffer.allocate(512);
- 进行 flip 操作,准备进行读操作。byteBuffer.flip();
- 下面可以读入数据。int numberOfBytes = fileChannel.read(byteBuffer);
- 接下来可以从缓冲区读取数据。char c = (char)byteBuffer.get();
如何写NIO缓冲区
- 创建缓冲区,分配容量。ByteBuffer byteBuffer = ByteBuffer.allocate(512); //容量设为512
- 写入数据。byteBuffer.put((byte) 0xff);
以上就是读写缓冲区的两个例子。缓冲区有很多种类型以及很多种读写方法。你可以根据使用要求进行选择。
Java NIO缓冲的更多相关文章
- Java NIO 缓冲技术详解
缓冲区(buffer)是从即将写入通道(channel)或刚刚从通道中读出的一段数据.它是一个持有数据,并扮演NIO通道端点的对象.缓冲区为数据访问和读写过程提供正式机制. 它是NIO和老版Java ...
- 【NIO】Java NIO之缓冲
一.前言 在笔者打算学习Netty框架时,发现很有必要先学习NIO,因此便有了本博文,首先介绍的是NIO中的缓冲. 二.缓冲 2.1 层次结构图 除了布尔类型外,其他基本类型都有相对应的缓冲区类,其继 ...
- Java NIO (转)
Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(B ...
- 【转】java NIO 相关知识
原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...
- JAVA NIO——Buffer和FileChannel
Java NIO和IO的主要区别 IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器 示例: import java.io.FileInputStream; import java.io ...
- 计算机网络(13)-----java nio手动实现简单的http服务器
java nio手动实现简单的http服务器 需求分析 最近在学习HTTP协议,还是希望动手去做一做,所以就自己实现了一个http服务器,主要功能是将http请求封装httpRequest,通过解析 ...
- java nio 与io区别
转自:http://blog.csdn.net/keda8997110/article/details/19549493 当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使 ...
- java nio(non-blocking io)简介及和io
在 Java1.4之前的I/O系统中,提供的都是面向流的I/O系统,系统一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节 的数据,面向流的I/O速度非常慢,而在Java 1 ...
- 攻破JAVA NIO技术壁垒
转载自攻破JAVA NIO技术壁垒 概述 NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector.传统IO基于字节流和字符流进行操作,而NIO基于Channel和 ...
随机推荐
- ARM的工作环境和工作模式
工作环境: 可以称之为“数据环境,”数据总线16位或者32位,应用于不同的情况下.16位的情况下,工作速度快,代码密度高. 工作模式: 设置程序数据所处的状态,为移植操作系统提供方便.
- MVC-EditorFor与TextBoxFor的区别
EditorFor会根据后面提供的数据类型自动判断生成的控件类型(比如TextBox,CheckBox等): TextBoxFor生成的只是一个TextBox.
- iOS8定位问题
正文:主要解决iOS8以前能定位,但是在iOS8时候无法定位的问题 在iOS8以前,我们的GPS定位是在用户设置的里面显示的是总是使用,但是在iOS8以后,苹果修改了这部分授权,你需要多加入2个pli ...
- margin负值 – 一个秘密武器
CSS盒模型中,margin是我们老熟悉的一个属性了, 它的负值你用过吗? 你知道 margin负值的秘密武器吗?我们一起看看吧! 1.带竖线分隔的横向列表(例如:网站底部栏目) 传统的分隔符是使用 ...
- xrange和range区别
range和xrange这两个函数基本都是在循环的时候使用的. >>> for x in range(10,21,1): ... print x ... 10 11 12 13 14 ...
- 玩玩EXPRESSJS
呵呵,反正有的是学习时间哈哈, 这个EXPRESSJS,看看实现的大约. 看的是http://www.expressjs.com.cn/ 代码A: var express = require('exp ...
- delphi中的各种文件类型介绍
1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...
- linux PCI设备初始化过程
linux PCI设备初始化过程 start_kernel->rest_init 这个函数会启动一个核心线程0, 核心线程然后调用init -> do_basic_setup. 然后我们开 ...
- 【HDOJ】4516 威威猫系列故事——因式分解
可解的算法太多了,采用的算法是试x的值.注意题目的输入x^3-2x^2不会写成x^3+-2x^2.一直RE在这儿. /* 4516 */ #include <iostream> #incl ...
- Oracle系列之权限
涉及到表的处理请参看原表结构与数据 Oracle建表插数据等等 赋予权限:前三个要在管理员权限用户下进行操作 方法1: grant dba to db_user;--赋予用户数据库管理权限 方法2: ...