- 浏览: 39918 次
文章分类
- 全部博客 (28)
- java (28)
- 样式和主题 (1)
- 项目创建 (1)
- Java字节码(.class文件)格式详解(一) (1)
- 一次定时任务 (1)
- 数组最大连续子序列和 (1)
- jquery-ajax (1)
- ORACLE中一个字符占多少字节 (1)
- Java网络编程 (1)
- Melkman凸包算法的Java实现 (1)
- ios UITableViewCell 文字缩进 (1)
- Websphere6.1静默安装(转) (1)
- newInstance() 和 new 有什么区别? (1)
- 项目管理规范 RUP管理实施中角色的划分 (1)
- 做了几天关于地理信息系统的软件测试工作 (1)
- 一边播放RM文件 一边播放相应的PPT文件 编程实现 (1)
- iPhone消息推送机制实现与探讨 (1)
- 详解C#中访问私有成员 (1)
- linux命令 (1)
- length & substr (1)
- javascript图片库 (1)
- remount failed: Operation not permitted (1)
- iBATIS报ORA-01745: 无效的主机/绑定变量名 异常 (1)
- Java NIO ByteBuffer (1)
- 【转】深入浅出Node.js 持续更新中 (1)
- gson (1)
- Jsp文件中播发视频文件 (1)
- pycetr: 从html文档中提取文档内容 (1)
- [jquery]IE与Chrome下text()方法获取textarea值不一致 (1)
最新评论
-
ygsilence:
factory是什么?
newInstance() 和 new 有什么区别? -
Simon.C:
清了那些多余的HTML标签吧……
Java NIO ByteBuffer -
eagle59:
不错,!希望下次可以排好版。
newInstance() 和 new 有什么区别? -
liudeh_009:
理解得不错
newInstance() 和 new 有什么区别?
<span class="Apple-style-span" style="font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; text-align: left; text-indent: 0px; white-space: normal; background-color: #ffffff; font-family: Arial; color: #333333;">
</span>
在 NIO 库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问 NIO 中的数据,都是将它放到缓冲区中。缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不仅仅
是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。
buffer其实只是一个美化了的<span style="font-family: mceinline;">数组</span>
。
<h1 style="margin: 0px; padding: 0px;">
<span style="font-family: mceinline;">状态变量</span>
</h1>
跟踪数据的状态情况使buffer可以自己管理数据资源
<div>
position
: 其实是指从buffer读取或写入buffer的下一个元素位置。比如,已经写入buffer 3个元素那那么position就是指向第4个位置,即position设置为3(数组从0开始计)。
<div>
limit
:还有多少数据需要从buffer中取出,或还有多少空间可以放入。postition总是<=limit。
<div>
capacity
: 表示buffer本身底层数组的容量。limit绝不能>capacity。
<div>
filp():<span style="font-weight: normal;">作了两件事情:[b]<span style="font-weight: normal;">1.将limit指向现在position的位置 2.将position设置为0 (limit=position;position=0)</span>
</span>
[/b]
<div>??<span style="white-space: pre;"> </span>
????这个过程可以使之前buffer写入数据时改变的状态变为可以“准备读取”。因为之前写到buffer中的数据就是position 到 limit-1 两个位置之间(limit指向最后一个数据的后一个位置)。
<div><img style="border-style: none;" src="http://hi.csdn.net/attachment/201002/14/1772742_1266136803H88h.jpg" alt="filp" width="468" height="211">
<div>
clear():
<div>???<span style="white-space: pre;"> </span>
也作了两件事:1. limit=capacity 2.position=0
<div>这个过程可以使buffer读取数据时改变的状态改变为“清空并准备写入”。
<div><img style="border-style: none;" src="http://hi.csdn.net/attachment/201002/14/1772742_1266136802WB4z.jpg" alt="clear" width="468" height="246">
<h1 style="margin: 0px; padding: 0px;">访问方法</h1>
<div>以下都以bytebuffer为例
<div>get():
<div>???前三个get方法是相对读取。就是相对于位置状态来读取数据,并且会改变position位置状态。
<div>???byte get();
<div>???ByteBuffer get(byte dst[]);//读取bytebuffer中数据写入 dst[]
<div>???ByteBuffer get(byte dst[],int offset, int length);
<div>???
<div>???该读取数据是绝对读取(一个byte),即会忽略limit和position值。并完全绕过了缓冲区的状态统计方法。
<div>???就是说不会改变buffer内部的位置状态。
<div>???byte get(int index);
<div>?
<div>put();
<div>???与get类似 前四个put方法是相对读取。即受position 以及limit影响,并且会改变 position。
<div>???ByteBuffer put( byte b );
<div>???ByteBuffer put( byte src[] ); //从src[]写入bytebuffer
<div>???ByteBuffer put( byte src[], int offset, int length );
<div>???ByteBuffer put( ByteBuffer src );
<div>???最后一个是绝对写入 不会影响position等位置状态。
<div>???ByteBuffer put( int index, byte b );
<div>?
<div>除了byte的读写还有其他类型的读写方法。并且他们都存在相对以及绝
对两类。
<div>?
<div>操作的典型使用:
<div><br>
<div>while (true) {<br>
???? buffer.clear(); // 准备将数据写入buffer<br>
???? int r = fcin.read( buffer ); // channel读取外部系统的数据并写入 buffer<br>
???? if (r==-1) {<br>
?????? break;<br>
???? }<br>
???? buffer.flip(); //准备将数据读出buffer<br>
???? fcout.write( buffer ); // channel读取buffer的数据并写到相应的外部系统<br>
}
<div><br>
<h1 style="margin: 0px; padding: 0px;">高级应用</h1>
<h2 style="margin: 0px; padding: 0px;">
<span style="font-family: monospace;">缓存区的分配和包装</span>
</h2>
<div>
<div>
<span style="font-family: monospace;">ByteBuffer.allocate(int);方法可以分配(创建)一个byte类型的buffer。</span>
<div>
<span style="font-family: monospace;">ByteBuffer.wrap(byte[]);方法可以将一个已有的byte数组包装出一个新的bytebuffer对象。</span>
<div>
<span style="font-family: monospace;">后一种方式需要小心处理原来的那个byte数组。因为它可以直接访问了。</span>
<h2 style="margin: 0px; padding: 0px;">
<span style="font-family: monospace;">缓冲区的分片</span>
</h2>
<div>
<span style="font-family: monospace;">分片就是建立“子缓冲区”。子缓冲区共享父缓冲区的一部分底层数组位置。</span>
<div>
<span style="font-family: monospace;">在某种意义上,子缓冲区就像原来的缓冲区中的一个窗口。</span>
<div>
<span style="font-family: monospace;">这样当改变子缓冲区的内容时,父缓冲区的相应位置也会被改变。</span>
<div>
<span style="font-family: monospace;">分片操作是根据当前position以及limit的值来确定的。</span>
<div>
<span style="font-family: monospace;">buffer.position( 3 );</span>
<div>
<span style="font-family: monospace;">buffer.limit( 7 );</span>
<div>
<span style="font-family: monospace;">ByteBuffer slice = buffer.slice();</span>
<h2 style="margin: 0px; padding: 0px;">
<span style="font-family: monospace;">只读缓冲区</span>
</h2>
<div>
<span style="font-family: monospace;">asReadOnlyBuffer()方法可以返回一个与原buffer对象一样的对象,只是新的buffer对象是只读的。</span>
<h2 style="margin: 0px; padding: 0px;">
<span style="font-family: monospace;">直接缓冲区</span>
</h2>
<div>
<span style="font-family: monospace;">sun的定义:给定一个直接字节缓冲区,Java 虚拟机将尽最大努力直接对它执行本机 I/O 操作。也就是说,它会在每一次调用底层操作系统的本机 I/O 操作之前(或之后),尝试避免将缓冲区的内容拷贝到一个中间缓冲区中(或者从一个中间缓冲区中拷贝数据)。</span>
<div>
<span style="font-family: monospace;">创建directbuffer的方式是用ByteBuffer.allocateDirect( int )
;方法替代ByteBuffer.allocate(int);</span>
<h2 style="margin: 0px; padding: 0px;">
<span style="font-family: monospace;">内存影射文件I/O</span>
</h2>
<div>
<span style="font-family: monospace;">它读写要比其他IO快很多.</span>
<div>
<span style="font-family: monospace;">他使文件或文件的一部分由内存影射。但是只有操作该部分位置的数据才是以内存方式读写的,而不是整个文件读入内存。(并且他是一个os的底层机制。由os底层异步完成内存与物理磁盘上的数据同步)</span>
<div>
<span style="font-family: monospace;">影射文件可以通过FileChannel对象的map方法得到。</span>
<div>
<span style="font-family: monospace;">比如以下就是将一个文件的前1024个字节影射到内存,并创建一个MappedByteBuffer对象返回出来。MappedByteBuffer是ByteBuffer的一个子类。</span>
<div>
<span style="font-family: monospace;">MappedByteBuffer mbb = fc.map( FileChannel.MapMode.READ_WRITE, start, size );</span>
?
发表评论
-
[jquery]IE与Chrome下text()方法获取textarea值不一致
2012-02-08 12:33 1325[size=small;]<br>[/si ... -
pycetr: 从html文档中提取文档内容
2012-02-07 13:39 896html文档中通常夹杂着各种广告,相关性链接等,提取正 ... -
Jsp文件中播发视频文件
2012-02-04 15:54 866详情请转至:↓ http://blog.sina.co ... -
gson
2012-02-04 13:09 3786最近的项目,接口传输格式用JSON,试用了一下goog ... -
【转】深入浅出Node.js 持续更新中
2012-02-03 14:09 973深入浅出Node.js(一):什么是Node.js h ... -
iBATIS报ORA-01745: 无效的主机/绑定变量名 异常
2012-02-01 10:09 5253今天发现发现线上报出一个异常: <br /> ... -
remount failed: Operation not permitted
2012-01-31 15:28 2031<span style="font-s ... -
javascript图片库
2012-01-11 13:58 730今天做了一个点击一个链接就在相应位置出现图片的DEMO ... -
length & substr
2011-12-21 13:08 792oracle中substr函数的用法 In ora ... -
linux命令
2011-12-21 12:19 909本章主要介绍Linux 的常用命令,其中主要有 文件 ... -
详解C#中访问私有成员
2011-12-20 11:29 798首先我必须承认访问一个类的私有成员不是什么好做法。大 ... -
iPhone消息推送机制实现与探讨
2011-12-20 10:24 1394最近两天在研究ios的消息推送机制。研究这个东西,还是 ... -
一边播放RM文件 一边播放相应的PPT文件 编程实现
2011-12-16 16:17 964应用情景:<br> 在制作网络课件的过程中 ... -
做了几天关于地理信息系统的软件测试工作
2011-12-15 16:59 948又忙活了几天。每天早早的就起床,到软件测试所在地,然后 ... -
项目管理规范 RUP管理实施中角色的划分
2011-12-15 09:39 725</span></font>& ... -
newInstance() 和 new 有什么区别?
2011-12-12 14:04 1518在初始化一个类, ... -
Websphere6.1静默安装(转)
2011-12-09 15:59 800<span style="color: ... -
ios UITableViewCell 文字缩进
2011-12-08 17:34 1145【前提】 UITableViewCell 原 ... -
Melkman凸包算法的Java实现
2011-12-08 10:51 4925坐标对象: ? public class Point{ ... -
Java网络编程
2011-12-07 16:31 813[img][/img]<ol> & ...
相关推荐
NULL 博文链接:https://chinaestone.iteye.com/blog/468138
设计思想: 每次通过nio读取字节到 fbb中 然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件结束 这样字节的判断,然后 返回行 如果 到达 fbb的结尾 还没有结束,就再通过nio读取一段字节,继续处理。 ...
使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com
NULL 博文链接:https://zheng12tian.iteye.com/blog/1094811
Java Nio ByteBuffer与Mina ByteBuffer的区别 Mina的几个类 与IoFilter相关的几个类 与IoHandler相关的几个类 IoFilter和IoHandler的区别和联系 配置Mina的线程模型
Java-NIO-Programming-Cookbook英文版和配套源代码。有一个使用DirectByteBuffer和Non-Direct Buffer文件读取速度的对比实验程序和测试结果。
在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来...
Chronicle Bytes具有与Java NIO的ByteBuffer类似的用途,但具有一些扩展。 API支持。 64位大小 UTF-8和ISO-8859-1编码的字符串。 线程安全关闭堆内存操作。 通过引用计数确定性地释放资源。 压缩数据类型,...
Buffer是数据的容器,在nio中负责数据的存取,java为不同数据类型提供了相对应的缓冲区类型 如:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 、DoubleBuffer 等。 Buffer的基本使用 ...
import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.Iterator; import com.nio.user.ClientUser...
yubo-java-nioNIO 直接缓冲区 VS 非直接缓冲区直接缓冲区1、直接缓冲区最适合I/O 2、创建成本比非直接缓冲区高 3、直接缓冲区使用的内存是通过调用原生的、操作系统特定的代码来分配的 4、内存存储区域不受限制垃圾...
原文:《Java NIO Scatter / Gather》 Scatter(分散):将一个 Channel 中的数据读取到多个 Buffer 中。 Gather(聚集):将多个 Buffer 中的数据写入一个 Channel 中。 Scatter/Gather 机制可以方便处理多个分开的...
NIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题。 1. Buffer:它是包括数据且用于读写的线形表结构。当中还提供了一个特殊类用于内存映射文件的I/O操作。 2. ...
• Multipurpose ...MINA没有直接使用使用java NIO的ByteBuffer类。它使用一个自制的ByteBuffer来扩展java。如果你使用MINA,你将不需要直接使用NIO buffers,因为仅使用MINA buffers就可以完成大多数buffer操作
目录运行效果截图:源代码:Server端:Client端:使用时注意:(持续更新) 运行效果截图: 启动server端: ...import java.nio.ByteBuffer; import java.nio.channels.Channel; import java.nio.c
AMP String = java.nio.ByteBuffer 或 byte[] AMP Unicode = java.lang.String AMP Boolean = java.lang.Boolean 或 boolean AMP 浮点数 = java.lang.Double 或 double AMP 十进制 = java.math.BigDecimal AMP...
import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; import java.util.Scanner; /** * 符合TCP协议,非阻塞IO NIO完成对应的客户端代码 * @Author kk * @Date 2020/3/16 15:10 */ public cl
深入理解Apache_Mina_(1)----_Mina的几个类 深入理解Apache_Mina_(2)----_与IoFilter相关的几个...深入理解Apache_Mina_(6)----_Java_Nio_ByteBuffer与Mina_ByteBuffer的区别(类图) 相信你们也愿意去下载更有价值的东西
java 1.4起,jdk支持了NIO(NEW IO),因NIO(os nonblocking)的非阻塞式工作方式,让应用服务器可以极大的优化线程模型,相比传统的阻塞式IO线程和链路一对一的模式,NIO只需少量的线程即可处理所有的链路,这对广大的...
Tests java.nio.ByteBuffer Source Code for Andriod.