- 浏览: 832903 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (363)
- 2010年3月 (3)
- 2010年4月 (3)
- Java (116)
- ExtJs (22)
- EJB3.0 (11)
- JQuery (28)
- SqlServer (5)
- Oracle (17)
- hibernate (21)
- struts2 (14)
- php (10)
- JavaScript (11)
- jbpm (6)
- spring (24)
- lucene (2)
- ibatis (7)
- C# (8)
- mysql (11)
- json (3)
- webservice (3)
- 设计模式 (1)
- jdbc (1)
- servlet (2)
- ice (6)
- 日常软件问题 (2)
- 生活 (2)
- iphone (1)
- rest (3)
- ruby (2)
- linux (13)
- quartz (1)
- poi (1)
- redis (13)
- memcached (4)
- nosql (2)
- tomcat调优 (1)
- 项目管理 (0)
最新评论
-
天使建站:
jquery里和数组相关的操作 附带具体的实例 ...
jquery对象数组 -
Cy0941:
$('#formId').form('submit',...) ...
easyui的form表单提交处理 -
shmily2038:
swifth 写道楼主,,你的命令写错啦,,[root@ser ...
centos直接yum安装nginx -
swifth:
楼主,,你的命令写错啦,,[root@server ~]# y ...
centos直接yum安装nginx -
随遇而安DXX:
...
REST
缓冲器仅仅是一个" 多功能 " 的数组。可能在这个 Buffer 类中没有体现,但是如果我们打开 ByteBuffer 的源码会有 byte[] 的数组,打开 CharBuffer 的源码会有 char[] 的数组。因为 Buffer 是所有缓冲器的父类,所以他它不能预计会有多少种缓冲器,所以索性让 " 儿子 " 们自己实现去吧
既然知道了缓冲器是一个" 多功能的数组 " ,那么我们用画图的形式来分析一下:
ByteBuffer buffer = ByteBuffer.allocate(8);//通过这句话,初始化一个byte缓冲器
首先大家要清楚的三个关于缓冲器状态的属性:
capacity:缓冲器的容量;
limit:缓冲器还有多少数据能够取出或者缓冲器已存放数据了;
position:相当于一个游标( cursor ),记录我们从哪里开始写数据,从哪里开始读数据。
还有缓冲区的两个重要的方法:
flip() : 反转此缓冲区。首先将限制设置为当前位置,然后将位置设置为 0。如果已定义了标记,则丢弃该标记。
clear(): 清除此缓冲区。将位置设置为 0,将限制设置为容量,并丢弃标记。
clear()
方法重设缓冲区,使它可以接受读入的数据。 flip()
方法让缓冲区可以将新读入的数据写入另一个通道。
// 初始化一个缓冲区 ByteBuffer buffer = ByteBuffer.allocate(8); while (true) { buffer.clear();//先清理缓冲区,以便可以往缓冲区放数据 position=0 limit=8 // 将字节序列从此通道读入给定的缓冲区。 int r = fcin.read(buffer); //写入完 position为读入个数, limit为8 if (r == -1) { break; } buffer.flip();//将开始读的位置position,设置为0,从头开始读,将limit写入数据的长度,设置为写入完时的position fcout.write(buffer);//写入完,position和limit 都为写入数据的长度 }
1、初始化byteBuffer,第一次clear完后的情况,如下图
position=0 limit=8 capacity表示byte缓冲区所能容纳的字节个数,表示一个容器的容纳元素的个数,想当于一个能力,不会随不同情况而变化,初始化完就是最大值。后面对这个变量不做解释。
2、第一次向Buffer 中写入数据后,
写入完数据后,position指向可写入数据的那个位置。 limit还是指向最大值
3、写入完数据后,要读取了,要先flip下
执行完flip,就表示要从byte缓冲区读取数据了,这时 position为缓冲器的开始位置,limit限制读取的数据量,故limit为读完数据的那个位置。
4、将缓冲器里面的数据写出完后:
读完数据时,position为数据的最大长度,limit没有变化还是数据的最大长度
评论
新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的
NIO弥补的不是java执行的速度,而是线程的利用率。阻塞和非阻塞本质上都是使用了系统端口的缓存数据,NIO最重要的是使用select和通道技术,更高效的利用了执行线程,这样一个线程可以处理多个连接。
嗯,确实,不过他跟1.4之前的标准io的传输方式的本质区别:
流的流入(InputStream)和流出(OutputStream),而nio是以管道的方式进行传输,传输数据都要经过缓冲器,不过是以块的方式。
使用标准io和nio比较的典型例子:
http://www.ibm.com/developerworks/cn/java/j-zerocopy/
InputStream和OutputStream名字上听起来是动态的流,其实底层还是调用系统的缓存数据,TCP底层不是一个字节一个字节传送,而是包传递,传递过来的数据缓存在系统端口的接收缓存区内,发送也是同样的道理。
其实可以打个比喻:老的IO就好比民工去讨薪,一个个去讨;新的IO好比白领发工资,boss主动发给你。
好像又不是很恰当,呵呵,反正就这么个意思啦。
新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的
NIO弥补的不是java执行的速度,而是线程的利用率。阻塞和非阻塞本质上都是使用了系统端口的缓存数据,NIO最重要的是使用select和通道技术,更高效的利用了执行线程,这样一个线程可以处理多个连接。
嗯,确实,不过他跟1.4之前的标准io的传输方式的本质区别:
流的流入(InputStream)和流出(OutputStream),而nio是以管道的方式进行传输,传输数据都要经过缓冲器,不过是以块的方式。
使用标准io和nio比较的典型例子:
http://www.ibm.com/developerworks/cn/java/j-zerocopy/
新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的
NIO弥补的不是java执行的速度,而是线程的利用率。阻塞和非阻塞本质上都是使用了系统端口的缓存数据,NIO最重要的是使用select和通道技术,更高效的利用了执行线程,这样一个线程可以处理多个连接。
体现出来的就是nio包和类,你自己测试一下,对比速度
新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的
发表评论
-
Jackson2.x通用工具类
2014-11-03 11:38 4904import java.io.IOException; i ... -
面试题
2013-02-27 09:04 1707从1加到100(考虑减少循环次数)使用数学公式 首先要知道 ... -
单例延迟实例化
2013-01-23 08:55 13271.如果出于性能的考虑而需要对实例域使用延迟初始化,就使用双 ... -
java中重载与重写的区别
2013-01-21 10:03 925首先我们来讲讲:重载(Overloading) ( ... -
自定义标签
2012-12-15 12:58 997package com.fsti.tag; import ... -
JAXB格式化beanToXml
2012-12-14 15:03 1274context = JAXBContext.n ... -
面向对象的特征有哪些方面?
2012-12-13 09:36 1007计算机软件系统是现实 ... -
面向对象三大特性一句话概括
2012-12-04 15:58 1553封装可以隐藏实现细节,使得代码模块化; 继承可以扩 ... -
Java序列化高级认识
2012-12-04 09:13 1065将 Java 对象序列化为二进制文件的 Java 序列化技术是 ... -
面向接口编程——提升系统多态性和可扩展性
2012-12-03 14:10 1284接口的本质 接口,在表面上是由几个没有主体代码的方 ... -
面向对象之多态
2012-11-23 19:22 874多态性(polymorphisn)是允许你将父对象设置成为和一 ... -
我对"秒杀"在技术性上的一些看法
2012-11-22 11:31 1011秒杀,是指电子商务 ... -
项目编码
2012-11-16 13:59 1157看两个项目所用的编码是否一样 Java的乱码问题: ... -
SVN错误:Attempted to lock an already-locked dir
2012-11-07 09:08 1027出现这个问题后使用“ ... -
面向对象的三个基本特征
2012-11-04 08:31 1088面向对象的三个基本特征是:封装、继承、多态。 封装 封装最 ... -
预编译防sql注入
2012-11-03 20:23 1972prepareStatement会先初始化SQL,先把这个SQ ... -
Java类与对象的初始化
2012-10-19 09:33 896Java类与对象的初始化 面试的时候,经常会遇到这样的笔试题 ... -
commons bean
2012-10-19 09:15 889这是两个javabean对象 package com.bea ... -
java工具DateUtil
2012-10-12 14:42 1052//一年内的周一 public final class Da ... -
JSP自定义标签实现过程
2012-10-03 09:34 896本文将通过自定义标签显示日期为例,简单谈谈JSP自定义标签 ...
相关推荐
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...
6. **多路复用器(Multiplexing)**:Java NIO的选择器实现了I/O多路复用,即单个线程可以同时处理多个连接,这在处理大量并发连接时非常有用。 7. **管道(Pipe)**:管道是两个线程间进行单向数据传输的通道。一...
Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 ...
Java NIO的反应器模式设计与实现,首先涉及到理解Java NIO的基本概念,如通道(Channel)、缓冲区(Buffer)、选择器(Selector)等。通道是进行读写操作的基础,是连接I/O源和数据的端点。缓冲区是在NIO中用于数据...
### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...
而Java NIO引入了选择器(Selector)和通道(Channel)的概念,允许单个线程同时处理多个连接,大大提高了系统在高并发环境下的性能。 本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何...
缓冲区类型包括ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等,它们都继承自`java.nio.Buffer`。 3. **选择器(Selector)**:用于监听多个通道的事件(如连接就绪、数据到达等),当某个通道准备好进行读写...
Java NIO提供了ByteBuf、CharBuf、ShortBuf、IntBuf、LongBuf、FloatBuf和DoubleBuf等不同类型的缓冲区,它们都有统一的API,如put()用于写入数据,get()用于读取数据,clear()用于清空缓冲区,flip()用于切换读写...
NIO的主要特点是面向缓冲区,非阻塞I/O,以及选择器,这些特性使得NIO在处理大量并发连接时表现出更高的效率。在本篇文章中,我们将深入探讨Java NIO如何读取文件。 一、NIO的基本概念 1. 缓冲区(Buffer):NIO的...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在Java 1.4版本中引入,NIO提供了一种全新的I/O编程方式,使得Java开发者能够更高效地处理I/O操作...
### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...
- **选择器**:Java NIO中的选择器允许单个线程监控多个通道,当这些通道准备进行读写操作时,选择器会通知线程,从而提高了多路复用的能力,有效利用了系统资源。 3. **文件系统操作** - Java NIO提供了一组文件...