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 缓冲技术详解的更多相关文章
- 《Tomcat与Java Web开发技术详解》思维导图
越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...
- 《精通Hibernate:Java对象持久化技术详解》目录
图书信息:孙卫琴 电子工业出版社 第1章 Java应用分层架构及软件模型: 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1 ...
- Java NIO ———— Buffer 缓冲区详解 入门
引言缓冲区是一个用于特定基本类型的容器.由java.nio 包定义,所有缓冲区都是 Buffer 抽象类的子类. Java NIO 中的 Buffer ,主要用于与NIO 通道进行交互.数据从通道存入 ...
- 《TomCat与Java Web开发技术详解》(第二版) 第八章节的学习总结 -- 访问mysql
终于学到如何访问Mysql了 1. 可以看看此章节提供的sql脚本,以后可以照着写了.此外,对于Mysql如何使用,最好的地方就是其官网介绍了.http://dev.mysql.com/doc/ref ...
- 《TomCat与Java Web开发技术详解》(第二版) 第六章节的学习总结 ---- JSP技术
第六章主要介绍了JSP的相关知识. 1.JSP:是通过在HTML文件中加入java程序片段(Java Scriptlet)和JSP标记,就构成了JSP文件.JSP实质上是Servlet.JSP的API ...
- 《TomCat与Java Web开发技术详解》(第二版) 第六章节对应CD附带的helloapp无法启动的问题解决
首先记录一下如何解决此章节CD中附带的helloapp无法启动的问题 我用的tomcat版本是:7.0.47:为了便于控制,针对此章节的helloapp,我在tomcat/conf/Catalina/ ...
- 《TomCat与Java Web开发技术详解》(第二版) 第五章节的学习总结 ---- Servlet的高级用法
这一章节主要是介绍了Servlet技术的一些高级用法,如下是我自己的整理归纳 1.下载文件:即获取服务器文件,并把文件写入反馈给客户端 ServletContext.getResourceAsStre ...
- 《TomCat与Java Web开发技术详解》(第二版) 第一章节的学习总结--HTTP组成+基本访问方式
1.需要看懂HTML文件中的组成元素的基本含义.不同的组成元素,可以使得HTML支持文本,图片(img,将图片发给客户端),静态音频/视频(embed src,将音频视频发给客户端),超链接(href ...
- 《TomCat与Java Web开发技术详解》(第二版) 第四章节的学习总结--常用Servlet API
要开发Servlet,自然要掌握常用的servlet的相关API.通过此章节的学习,了解到如下常用API 1.Servlet接口--->GenericServlet抽象类(实现Servlet接口 ...
随机推荐
- 使用grub硬盘重装ubuntu
电脑一直是双系统,Windows8 + Ubuntu13.04,昨天瞎搞,更新了一下QT,结果就不能开机了...真心难. 老系统坏了也好,正好可以装个Ubuntu14.04LTS.手边没有U盘,可以把 ...
- org.springframework.web.servlet.view.InternalResourceViewResolver
http://blog.csdn.net/superdog007/article/details/28857495 我们在controller里面经常这样return一个ModelAndView: r ...
- Grails默认首页的修改
有些人使用IDEA开发Grails,开发阶段使用Grails自带的默认首页可以方便我们开发,但是开发结束后想要修改默认的首页,如何修改呢? 1.打开grails-app 文件下conf下的UrlMap ...
- nodejs 第一次使用
在win7下安装与使用 1 nodejs官网下载,安装 https://nodejs.org/ 2 下载最新的 npm,在E:\nodejs\中解压 http://nodejs.org/dist/ ...
- Hbase 0.96 比 hbase 0.94的改变
转载:http://blog.csdn.net/hxpjava1/article/details/20043703 环境: hadoop:hadoop-2.2.0 hbase:hbase-0.96.0 ...
- 将CMD内的显示内容输出到txt文件
将CMD内的显示内容输出到txt文件 xxxx -t >c:\test.txt //xxxx为命令 如ping www.baidu.com //-t >c:\test.tx ...
- BZOJ 3992 [SDOI 2015] 序列统计 解题报告
这个题最暴力的搞法就是这样的: 设 $Dp[i][j]$ 为前 $i$ 个数乘积为 $j$ 的方案数. 转移的话就不多说了哈... 当前复杂度 $O(nm^2)$ 注意到,$M$ 是个质数,就说明 $ ...
- PHP漏洞全解(七)-Session劫持
本文主要介绍针对PHP网站Session劫持.session劫持是一种比较复杂的攻击方法.大部分互联网上的电脑多存在被攻击的危险.这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能. ...
- zepto源码学习-03 $()
在第一篇的时候提到过关于$()的用法,一个接口有很多重载,用法有很多种,总结了下,大概有一以下几种 1.$(selector,context?) 传入一个选择器返回一个zepto对象 2.$(func ...
- Spring MVC使用commons fileupload实现文件上传功能
通过Maven建立Spring MVC项目,引入了Spring相关jar依赖. 1.为了使用commons fileupload组件,需要在pom.xml中添加依赖: <properties&g ...