- 浏览: 254675 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 790java技能树 -
Java看书笔记
2014-08-07 17:15 723这一篇专用于一些日常的Java读书笔记 先写一点关 ... -
XStream和Jackson的使用优化
2012-12-17 11:09 0marker一下,需要研究一下这2种lib的使用方式。 -
ArrayList与LinkedList的简单比较
2012-07-27 11:07 1543本文同步发表在http://www.xeclipse.com/ ... -
java.lang.System类浅析
2012-07-25 09:58 1903本文同步发表在 http://www.xeclipse.com ... -
Linux/Unix下JFreeChart的NoClassDefFoundError问题
2012-07-04 14:51 1671最近遇到这样一个问题,使用JFreechart 1.0.13开 ... -
【转】常见的开源协议
2011-08-12 15:47 513Mozilla Public License ... -
【转】JDK发布版本时间以及代号
2011-06-20 14:02 1564已发行的版本: 版本号 名称 中文名 发布日期 ... -
最近的apache学习计划
2011-06-09 11:58 1236最近可能会要做一些apache相关的学习和开发工作,有一些pr ... -
Object类wait,notify,notifyAll的使用
2011-05-06 11:02 1468这三个方法是java的基础类Object中定义的。 w ... -
Java 内存的那些事
2011-02-22 10:38 5013虽然Java屏蔽了一下内存 ... -
一些有用的Web Service 地址
2011-02-11 11:11 2215这里记录一下比较有用的Web Service 地址,可能会有用 ... -
【Java】利用HTML生成PDF之问题整理
2011-01-06 14:38 3938首先,技术为apache 的FOP ... -
【转】如何在java程序中设置文件为“隐藏”属性
2010-10-19 10:55 1610引自http://linshiquan.iteye.com/b ... -
【转】字符,字节和编码
2010-10-18 10:09 1196引言 “字符与编码” ... -
Effective Java 第2版 笔记
2010-08-18 15:45 1855Item 1;Consider static factoriy ... -
Java, 那些美妙的书籍
2010-08-10 15:39 7216整理一下最近看过或者比较有兴趣的Java书籍,以供大家参考 ... -
Object的equals()重写
2010-08-10 14:49 1560JDK1.6 API写道 public boolean e ... -
Object的equals()与hashCode()的关系
2010-08-10 14:37 0笔者在以前Java项目中使用findbugs工具时,经常遇到一 ... -
学习JVM 之 class文件校验器
2010-07-21 11:29 1977JVM中的class文件校 ...
相关推荐
Java NIO:浅析IO模型 Java NIO是Java语言中用于高性能I/O操作的API,理解IO模型是学习Java NIO的基础。本文将从同步和异步的概念开始,然后介绍阻塞和非阻塞的区别,接着介绍阻塞IO和非阻塞IO的区别,最后介绍五种...
Java NIO,全称为New Input/Output,是Java在JDK 1.4版本中引入的一个新特性,用于替代传统的IO API。NIO的核心在于它提供了非阻塞的I/O操作,提高了I/O性能,特别是在高并发场景下,极大地提升了系统资源利用率。 ...
在"2021最新-Java NIO视频教程.txt打包整理.zip"这个资源中,你可能学习到如何创建和管理通道、缓冲区的使用、选择器的注册与选择、文件系统操作的优化、字符集编码的处理以及如何利用NIO进行网络编程等内容。...
Java NIO(New Input/Output)是Java标准库在JDK 1.4引入的一组新的I/O API,它提供了一种不同于传统IO的高效、非阻塞的I/O操作方式。NIO的核心概念包括Channel、Buffer和Selector,它们共同构建了一个与操作系统...
Java核心面试知识整理包括了对JVM内存区域、垃圾回收机制、GC算法、JVM类加载机制、Java集合框架以及Java IO/NIO等多个方面的深入讲解。以下是对这些知识点的详细介绍: JVM内存区域:JVM内存区域包括了程序计数器...
在"Java常用代码整理"这个主题中,我们可以探讨多个Java编程中的关键知识点,包括基础语法、面向对象特性、异常处理、集合框架、IO流、多线程、网络编程以及实用工具类等。 1. **基础语法**:Java的基础语法包括...
【JAVA语言概述】 Java是一种跨平台的面向对象的编程语言,由Sun Microsystems开发,现由Oracle公司维护。它的设计目标是实现“一次编写,到处运行”,通过Java虚拟机(JVM)确保代码在不同操作系统上都能运行。Java...
本文档是一份关于Java核心面试知识的整理资料,内容涉及Java虚拟机(JVM)、Java内存模型、垃圾回收机制、Java IO/NIO、Java集合等多个关键知识点。通过对这些知识的梳理,能够帮助Java开发者更好地准备面试,同时也...
以下是对Java IO的详细整理: 首先,Java中的`File`类是操作文件和目录的基础,它提供了许多方法来创建、删除、重命名文件以及检查文件属性。在案例1中,通过`new File("D:\\hello.txt")`创建了一个`File`对象,...
本资料"JAVA高级知识点整理.rar"主要涵盖了多线程、虚拟机、Java IO/NIO以及Java集合框架等核心主题,旨在帮助开发者深入理解Java平台的高级特性和最佳实践。 首先,多线程是Java编程中的重要组成部分,它允许程序...
Java核心知识点整理包含了Java编程语言中多个关键领域的内容,这些领域对于Java开发者来说是必须掌握的。以下是根据提供的文件内容整理的知识点: 1. JVM (Java虚拟机) - JVM内存区域包括程序计数器、虚拟机栈、...
5. **IO流与NIO**:输入输出流的理解和使用,包括文件操作、网络通信等,以及Java NIO(非阻塞I/O)的概念和应用。 6. **多线程**:线程的创建、同步、死锁等问题,以及Thread、Runnable、ExecutorService等并发...
Java架构知识库整理PDF版是一份详尽的资源,涵盖了Java开发和架构设计的各个方面,旨在为Java学习者提供一个全面的学习指南。这份文档可能包含了从基础语法、面向对象编程概念,到高级并发处理、内存管理、性能优化...
Java核心知识整理 Java是一种广泛使用的面向对象编程语言,它具有跨平台、对象导向、简单易学等特点。作为Java工程师,需要掌握Java的多方面知识点,包括但不限于JVM(Java虚拟机)原理、Java内存模型、垃圾回收...
从给定文件的标题、描述、标签以及部分内容中整理出的Java核心知识点如下: 首先,标题中的"JAVA核心知识点整理.pdf"说明这份文档是一个关于Java编程语言的核心知识集合,很可能是为了面试准备而编写的资料。描述中...
### JAVA核心知识整理 ...以上内容覆盖了JAVA核心知识整理中的关键知识点,包括JVM的基础知识、垃圾回收机制、引用类型、GC垃圾收集器的选择、IO/NIO模型及其实现、类加载机制以及常见的集合类等。
标题《JAVA核心面试知识整理》指出了整理的内容主要是Java基础知识,对于面试来说,这些基础知识点是必考的核心,掌握这些知识对求职者至关重要。描述中提到“搞懂这些,最起码不会饿死”,暗示这些知识点是Java编程...
Java面试题整理集合 在Java领域,面试是评估求职者技术实力的重要环节。这份整理集合涵盖了Java编程语言的基础、进阶、并发、内存管理、框架等多个方面,旨在帮助准备面试的开发者全面了解并掌握Java的核心知识。...