- 浏览: 250297 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
aquarion:
非常感谢,解决了我的问题
Perspective 自定义设置扩展点 -
zheng_zhen:
好文章,进一步问您一下,请问自己实现的run/debug如何能 ...
【原创】Eclipse Launcher (Run/Debug As 菜单扩展)实现 -
salever:
mwdnjupt 写道http://www.xeclipse. ...
浅析OSGI的bundle依赖 -
mwdnjupt:
http://www.xeclipse.com/?p=1165 ...
浅析OSGI的bundle依赖 -
Tom.X:
插件化、模块化应遵循高内聚、低耦合的原则,尽量不要在各bund ...
浅析OSGI的bundle依赖
看了看Java的nio类库,整理一下思路。
1,Buffer
jdk官方文档上对Buffer的描述为:
缓冲区的容量 是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。
缓冲区的限制 是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。
缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。
对于每个非 boolean 基本类型,此类都有一个子类与之对应。
Buffer里面的这个几个变量,控制了buffer的put和get行为,之间的相关关系为:
0 <= 标记 <= 位置 <= 限制 <= 容量
新创建的缓冲区总有一个 0 位置和一个未定义的标记。初始限制可以为 0,也可以为其他值,这取决于缓冲区类型及其构建方式。一般情况下,缓冲区的初始内容是未定义的。
几个常见的操作说明:
-
clear()
使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。 -
flip()
使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。 这个操作尤其在read完buffer以后,使用之前调用一次 -
rewind()
使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。
我们常用的也就是ByteBuffer、CharBuffer了。
2,Channel
通道表示到实体,如硬件设备、文件、网络套接字或可以执行一个或多个不同 I/O 操作(如读取或写入)的程序组件的开放的连接。
通道可处于打开或关闭状态。创建通道时它处于打开状态,一旦将其关闭,则保持关闭状态。一旦关闭了某个通道,试图对其调用 I/O 操作就会导致 ClosedChannelException 被抛出。通过调用通道的 isOpen 方法可测试通道是否处于打开状态。
Channel有很多实现,AbstractInterruptibleChannel, AbstractSelectableChannel, DatagramChannel, FileChannel, Pipe.SinkChannel, Pipe.SourceChannel, SelectableChannel, ServerSocketChannel, SocketChannel ,下面演示一下用FileChannel进行文件复制:
/** * Copy file using nio. * @param inFile * @param outFile */ public static void copyFile(String inFile, String outFile) { try { FileInputStream in = new FileInputStream(inFile); FileOutputStream out = new FileOutputStream(outFile); FileChannel cIn = in.getChannel(); FileChannel cOut = out.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); int length = 0; while(true){ buffer.clear(); length = cIn.read(buffer); if(length == -1){ break; } buffer.flip(); cOut.write(buffer); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
3,Selector
selector是nio实现非阻塞式通信的核心,它是SelectableChannel
对象的多路复用器。
关于selector的介绍,SUN的jdk 文档里面已经有很多了,这里不赘述了,下面演示一下如何使用selector和channel实现非阻塞的网络通信。
ServerDemo.java
/** * @author */ public class ServerDemo { public static void main(String[] args) throws Exception { boolean readAllready = true; Charset charset = Charset.forName("utf-8"); ByteBuffer buffer = ByteBuffer.allocate(1024); ServerSocketChannel ssocketChannel = ServerSocketChannel.open(); ssocketChannel.socket().bind(new InetSocketAddress(6018)); LogUtil.info("启动了一个ServerSocketChannel"); ssocketChannel.configureBlocking(false); Selector selector = Selector.open(); ssocketChannel.register(selector, SelectionKey.OP_ACCEPT); LogUtil.info("等待客户端连接......"); String content = ""; while (selector.select() > 0) { Set<SelectionKey> set = selector.selectedKeys(); for (SelectionKey key : set) { SocketChannel channel; if(key.isAcceptable()){ channel = ssocketChannel.accept(); LogUtil.error("有新的客户端连接:" + channel); LogUtil.error("地址是: " + channel.socket()); channel.configureBlocking(false); channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); } if(key.isReadable()){ readAllready = true; LogUtil.error("有新的读取"); channel = (SocketChannel) key.channel(); channel.read(buffer); buffer.flip(); content = charset.decode(buffer).toString() + "\r\n"; LogUtil.info("Read from clent <<<<<<<<<<< " + content); buffer.clear(); } if(key.isWritable()){ if(readAllready){ channel = (SocketChannel) key.channel(); buffer.put(("Write into client >>>>>>>>> " + content).getBytes()); buffer.flip(); channel.write(buffer); buffer.clear(); Thread.sleep(1000); readAllready = false; } } } set.clear(); } LogUtil.info("服务器推出"); } }
其中LogUtil是一个打印日志的泪类,可以用System.out代替。
测试这个服务器,可以自己启动一个连接到6018端口的客户端,比如telnet 本地IP 6018,就可以看到效果了
发表评论
-
Java 技能树
2016-07-25 18:58 727java技能树 -
Java看书笔记
2014-08-07 17:15 696这一篇专用于一些日常的Java读书笔记 先写一点关 ... -
XStream和Jackson的使用优化
2012-12-17 11:09 0marker一下,需要研究一下这2种lib的使用方式。 -
ArrayList与LinkedList的简单比较
2012-07-27 11:07 1490本文同步发表在http://www.xeclipse.com/ ... -
java.lang.System类浅析
2012-07-25 09:58 1860本文同步发表在 http://www.xeclipse.com ... -
Linux/Unix下JFreeChart的NoClassDefFoundError问题
2012-07-04 14:51 1633最近遇到这样一个问题,使用JFreechart 1.0.13开 ... -
【转】常见的开源协议
2011-08-12 15:47 485Mozilla Public License ... -
【转】JDK发布版本时间以及代号
2011-06-20 14:02 1507已发行的版本: 版本号 名称 中文名 发布日期 ... -
最近的apache学习计划
2011-06-09 11:58 1195最近可能会要做一些apache相关的学习和开发工作,有一些pr ... -
Object类wait,notify,notifyAll的使用
2011-05-06 11:02 1434这三个方法是java的基础类Object中定义的。 w ... -
Java 内存的那些事
2011-02-22 10:38 4946虽然Java屏蔽了一下内存 ... -
一些有用的Web Service 地址
2011-02-11 11:11 2175这里记录一下比较有用的Web Service 地址,可能会有用 ... -
【Java】利用HTML生成PDF之问题整理
2011-01-06 14:38 3829首先,技术为apache 的FOP ... -
【转】如何在java程序中设置文件为“隐藏”属性
2010-10-19 10:55 1565引自http://linshiquan.iteye.com/b ... -
【转】字符,字节和编码
2010-10-18 10:09 1146引言 “字符与编码” ... -
Effective Java 第2版 笔记
2010-08-18 15:45 1780Item 1;Consider static factoriy ... -
Java, 那些美妙的书籍
2010-08-10 15:39 7180整理一下最近看过或者比较有兴趣的Java书籍,以供大家参考 ... -
Object的equals()重写
2010-08-10 14:49 1500JDK1.6 API写道 public boolean e ... -
Object的equals()与hashCode()的关系
2010-08-10 14:37 0笔者在以前Java项目中使用findbugs工具时,经常遇到一 ... -
学习JVM 之 class文件校验器
2010-07-21 11:29 1943JVM中的class文件校 ...
相关推荐
java nio操作基础 java IO整理
JavaNIO[整理].pdf
2021最新-Java NIO视频教程.txt打包整理.zip
整理:网站建设与网站制作公司-VeiSun.Com)简单介绍:MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度
本文主要介绍Java NIO原理的知识,这里整理了详细资料及简单示例代码和原理图,有需要的小伙伴可以参考下
尚硅谷java教程全程跟听,手动整理,从面向对象开始按章节按课时整理,适合对照视频作为笔试使用/java知识脉络梳理/八股理解背诵
在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。对java io nio相关知识感兴趣的朋友一起学习吧
Java高级技术整理,包含多线程、虚拟机、JAVA IO/NIO 、Java集合 等高级进阶知识点
JAVA核心知识点整理,涵盖JAVA基础、集合类、JVM、IO/NIO、多线程、Spring原理等知识。
本文主要介绍Java 高并发NIO和AIO 的知识,这里整理了详细的资料,并详细介绍了 1. 什么是NIO 2. Buffer 3. Channel 4. 网络编程 5. AIO的知识,有需要的小伙伴可以参考下
NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的...
在本篇文章里小编给大家整理的是关于Java实现基于NIO的多线程Web服务器实例内容,需要的朋友们可以学习下。
JAVA知识要点大集合,NIO 主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector
无涯教程网(learnfk)整理提供:NIO是一种同步非阻塞的I/O模型,是解决高并发、I/O处理问题的有效方式。
JAVA核心面试知识点整理.pdf Java垃圾收集必备手册.pdf Java虚拟机(JVM)面试题 51道.pdf SpringBoot面试题 30道.pdf Spring面试题(含答案).pdf 多线程面试59题(含答案).pdf 面试题集(全).pdf 设计模式面试题 ...
• 熟悉常用IO模型(BIO、NIO、AIO),熟悉JVM类加载过程与机制 • 了解JVM性能监控以及调优,会使用jps、jstack、jmap、jstat、jhat,了解内存泄露排查具体方法 • Java基础 • 熟练的使用Java语言进行面向对象程序...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
2011最新整理java经典代码.doc 25个经典的Spring面试问答.docx 8张图解java.docx Addison.Wesley.Java.Concurrency.in.Practice.May.2006.chm Agile Java 测试驱动开发的编程技术.pdf Java 8 默认方法和多继承.docx ...
2011最新整理java经典代码.doc 25个经典的Spring面试问答.docx 8张图解java.docx Addison.Wesley.Java.Concurrency.in.Practice.May.2006.chm Agile Java 测试驱动开发的编程技术.pdf Java 8 默认方法和多继承.docx ...
最新整理的Java中的IO与NIO相关面试题目总结,java求职面试题,共15题,含答案解析,希望能帮到有需求的同学