- 浏览: 5166662 次
- 性别:
- 来自: 天津
博客专栏
-
实战 Groovy
浏览量:29350
文章分类
- 全部博客 (639)
- 代码之谜 (6)
- JavaScript quirks (5)
- 程序员 (92)
- Java (93)
- BT编程 (7)
- html/css (64)
- Groovy&Grails (42)
- Android (20)
- C/C++ (5)
- PHP/Perl/Python (46)
- 经典文章 (51)
- CodeIgniter (14)
- JQuery (10)
- 笑话 (4)
- 其他 (32)
- javascript (69)
- 云计算 (0)
- html5 (7)
- 面试 (8)
- google (3)
- nosql (2)
- nodejs (11)
- go (5)
- erlang (1)
- 小常识 (3)
- 冷知识 (5)
- database (4)
- web (12)
- 架构 (12)
- Exception (0)
最新评论
-
jqw1992:
https://www.chromefor.com/libra ...
[福利] 开发者必备的 Chrome 插件——ChromeSnifferPlus -
litjerk:
初步算了一下,目前最最精简的Win98版是5M,他5个小时多敲 ...
让人目瞪口呆的三位世界级电脑大师 -
379855529:
。。似乎重点没说NIO啊,前面基础只是铺垫的很好的,可是我要的 ...
Java NIO与IO的详细区别(通俗篇) -
springmvc_springjpa:
spring mvc demo教程源代码下载,地址:http: ...
一步步开发 Spring MVC 应用 -
匡建武:
Good
四个程序员的一天
Java 7提供了一个新API访问文件系统,但除此之外,JSR 203(NIO.2)还包含其它很多新特性,这个新版本的确新增了很多改善I/O编程的类,本文将会介绍下面的新特性:
· SeekableByteChannel:随机访问通道;
· MulticastChannel:允许IP多播的通道;
· NetworkChannel:新的网络通道超级接口;
· 异步I/O API:新的API使I/O操作可以异步进行。
SeekableByteChannel
首先,Java 7包括新的ByteChannel – SeekableByteChannel,这个通道维护当前的位置,你可以读写该位置,并允许随机访问。使用这个类型的通道,你可以添加多个线程读/写在 不同位置相同的线程。
SeekableByteChannel channel1 = Paths.get("Path to file").newByteChannel();//Simply READ
SeekableByteChannel channel2 = Paths.get("Path to file").newByteChannel(StandardOpenOption.READ, StandardOpenOption.WRITE);//READ and WRITE
你可 以使用下面这些方法操作位置和通道的大小。
· long position():返回目前的位置;
· long size():返回通道连接实体的当前大小,如通道连接的文件大小;
· position(long newPosition):移动当前位置到某个地方;
· truncate(long size):根据给定大小截断实体。
position()和truncate()方法简单地返回当前通道,允许链式调用。
现在FileChannel实现了新的接口,使 用所有FileChannel你都可以实现随机访问,当然你可以用它读取一个文件:
SeekableByteChannel channel = null;
try {
channel = Paths.get("Path to file").newByteChannel(StandardOpenOption.READ);
ByteBuffer buf = ByteBuffer.allocate(4096);
System.out.println("File size: " + channel.size());
String encoding = System.getProperty("file.encoding");
while (channel.read(buf) > 0) {
buf.rewind();
byte[] bytearr = new byte[bytebuff.remaining()];
buf.get(bytearray);
System.out.print(new String(bytearray));
buf.flip();
System.out.println("Current position : " + channel.position());
}
} catch (IOException e) {
System.out.println("Expection when reading : " + e.getMessage());
e.printStackTrace();
} finally {
if (sbc != null){
channel.close();
}
}
MulticastChannel
这个新的接口允许开启IP多播,因此你可以向一个完整的组发送和接收IP数据报。多 播实现了直接绑定本地多播设备,这个接口是通过DatagramChannel和AsynchronousDatagramChannel实现的。
下面是从Javadoc中摘取的一个打开DatagramChannel t的简单示例:
NetworkInterface networkInterface = NetworkInterface.getByName("hme0");
DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)
.setOption(StandardSocketOption.SO_REUSEADDR, true)
.bind(new InetSocketAddress(5000))
.setOption(StandardSocketOption.IP_MULTICAST_IF, networkInterface);
InetAddress group = InetAddress.getByName("225.4.5.6");
MembershipKey key = dc.join(group, networkInterface);
你可以使用以前经常使用的DatagramChannel,但操作方式是多播了,因此你收到的是接口中所有的数据包,你发送的数据包会发到所有组。
NetworkChannel
现在所有网络通道都实现了新的NetworkChannel接口,你可以轻松绑定套接字 管道,设置和查询套接字选项,此外,套接字选项也被扩展了,因此你可以使用操作系统特定的选项,对于高性能服务器这非常有用。
异步I/O
现在我们介绍最重要的新特性:异步I/O API,从它的名字我们就知道它有什么功能了,这个新的通道为套接字和文件提供了异步操作。
当然,所有操作都是非阻塞的,但对所有异步通道,你也可以执行阻塞操作,所有异步I/O操作都有下列两种形式中的一种:
· 第一个返回java.util.concurrent.Future,代表等待结果,你可以使用Future特性等待I/O操作结束;
· 第二个是使用CompletionHandler创建的,当操作结束时,如回调系统,调用这个处理程序。
下面是它们的一些例子,首 先来看看使用Future的例子:
AsynchronousFileChannel channel =AsynchronousFileChannel.open(Paths.get("Path to file"));
ByteBuffer buffer = ByteBuffer.allocate(capacity);
Future result = channel.read(buffer, 100); //Read capacity bytes from the file starting at position 100
boolean done = result.isDone(); //Indicate if the result is already terminated
你也可以等待结束:
int bytesRead = result.get();
或等待超 时:
int bytesRead = result.get(10, TimeUnit.SECONDS); //Wait at most 10 seconds on the result
再来看看使用CompletionHandler的例子:
Future result = channel.read(buffer, 100, null, new CompletionHandler(){
public void completed(Integer result, Object attachement){
//Compute the result
}
public void failed(Throwable exception, Object attachement){
//Answer to the fail
}
});
正如你所看到的,你可以给操作一个附件,在操作末尾给 CompletionHandler,当然,你可以把null当作一个附件提供,你可以传递任何你想传递的,如用于 AsynchronousSocketChannel的Connection,或用于读操作的ByteBuffer。
Future result = channel.read(buffer, 100, buffer, new CompletionHandler(){
public void completed(Integer result, ByteBuffer buffer){
//Compute the result
}
public void failed(Throwable exception, ByteBuffer buffer){
//Answer to the fail
}
});
正如你所看到 的,CompletionHandle也提供Future元素表示等待结果,因此你可以合并这两个格式。
下面是NIO.2中的所有异步 通道:
· AsynchronousFileChannel:读写文件的异步通道,这个通道没有全局位置,因此每个读写操作都需要一个位置,你可以使用不同的线程同 时访问文件的不同部分,当你打开这个通道时,必须指定READ或WRITE选项;
· AsynchronousSocketChannel:用于套接字的一个简单异步通道,连接、读/写、分散/聚集方法全都是异步的,读/写方法支持超时;
· AsynchronousServerSocketChannel:用于ServerSocket的异步通道,accept()方法是异步的,当连接被接 受时,调用CompletionHandler,这种连接的结果是一个AsynchronousSocketChannel;
· AsynchronousDatagramChannel:用于数据报套接字的通道,读/写(连接)和接收/发送(无连接)方法是异步的。
分组
当你使用AsynchronousChannels时,有线程调用完整的处理程序,这些线程被绑定到一个 AsynchronousChannelGroup组,这个组包含一个线程池,它封装了所有线程共享的资源,你可以使用线程池来调用这些 组,AsynchronousFileChannel可以使用它自己的组创建,将ExecutorService作为一个参数传递给open()方法,在 open方法中,通道是使用AsynchronousChannelGroup创建的,如果你不给它一个组,或传递一个NULL,它就会使用默认组。通道 被认为是属于组的,因此,如果组关闭了,通道也就关闭了。
你可以使用ThreadFactory创建一个组:
ThreadFactory myThreadFactory = Executors.defaultThreadFactory();
AsynchronousChannelGroup channelGroup =AsynchronousChannelGroup.withFixedThreadPool(25, threadFactory);
或使用一个ExecutorService:
ExecutorService service = Executors.newFixedThreadPool(25);
AsynchronousChannelGroup channelGroup =AsynchronousChannelGroup.withThreadPool(service);
而且你可以很容易地使用它:
AsynchronousSocketChannel socketChannel =AsynchronousSocketChannel.open(channelGroup);
你可 以使用在组上使用shutdown()方法关闭组,关闭之后,你就不能使用这个组创建更多的通道,当所有通道关闭后,组也终止了,处理程序结束,资源也释 放了。
当你使用任何类型的池和CompletionHandler时,你必须要注意一点,不要在CompletionHandler内 使用阻塞或长时间操作,如果所有线程都被阻塞,整个应用程序都会被阻塞掉。如果你有自定义或缓存的线程池,它会使队列无限制地增长,最终导致 OutOfMemoryError。
我想我把新的异步I/O API涵盖的内容讲得差不多了,当然这不是一两句话可以说清楚的,也不是每一个人都会使用到它们,但在某些时候它确实很有用,Java支持这种I/O操作 终归是一件好事。如果我的代码中有什么错误我表示道歉,因为我也是刚刚才接触。
发表评论
-
Java NIO与IO的详细区别(通俗篇)
2014-01-02 10:51 69426内核空间、用户空间 ... -
Java EE 单元测试
2013-09-12 10:56 4781觉得测试 Java EE 应用程序太困难、不方便或者太复杂? ... -
JUnit 测试建议
2013-07-22 09:04 3482以下是对JUnit实践的一 ... -
老生常谈:面试算法有必要吗?
2013-04-01 09:55 32764声明:虽然发表在愚人节,但是文章内容很严肃。 前几天在知 ... -
一步步开发 Spring MVC 应用
2013-02-23 10:53 10352Spring MVC 框架 Spring 框 ... -
「译」Java集合框架系列教程四:Set接口
2013-01-18 13:20 2531原文:The Set Interface 译文:Java集 ... -
「译」Java集合框架系列教程三:Collection接口
2013-01-18 13:16 2371原文:The Collection Interface 译 ... -
「译」Java集合框架系列教程二:集合接口
2013-01-18 13:13 2012原文:http://docs.oracle.c ... -
Java集合框架系列教程一:集合框架简介
2013-01-18 12:47 3031原文:http://docs.oracle.com/jav ... -
Java泛型-类型擦除
2012-12-05 15:48 14618一、概述 Java泛型在使用过程有诸多的 ... -
千万不要把 bool 当成函数参数
2012-11-16 08:33 12494我们有很多 Coding Style 或 代码规范。 但这一条 ... -
网站建设中关于eclipse启动参数的优化
2012-08-23 09:23 2503在网站建设中,经常用 ... -
Eclipse程序员要掌握的常用快捷键
2012-08-22 09:33 10062判断一个人的编程水平,就看他用键盘多,还是鼠标多。用键 ... -
java中equals和==的区别
2012-08-15 16:31 2032值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在 ... -
名词王国里的死刑(翻译) - A Story of Hello World
2012-07-23 10:43 11812翻译自Steve Yegge的大 ... -
好代码是廉价的代码
2012-07-19 08:03 3296长久以来我一直主张:好代码是廉价的代码。 当我跟做开发 ... -
只要一个返回语句
2012-05-18 13:18 1821别再这样写了: publ ... -
java编程的78条黄金法则
2012-05-16 12:57 2365创建和销毁对象 1、考虑用静态工厂方法(返回类的实例的 ... -
for 循环为何可恨?
2012-05-15 12:44 1621Java的闭包(Closure)特征最近成为了一个热门话 ... -
Java 8 新功能
2012-05-02 08:48 1902我们已经急不可待想知道Java 8可用的新功能,其中大部 ...
相关推荐
在Java编程领域,JDK 7引入了一个重要的更新——NIO2.0,也被称为“New I/O 2.0”或“AIO”(Asynchronous I/O)。这个更新极大地提升了Java处理I/O操作的能力,特别是在文件系统交互和网络通信方面。NIO2.0主要增加...
Java 7引入的新I/O API,也称为NIO.2,是Java语言中的一大改进,为开发者提供了更高效、更灵活的I/O操作方式。这一API主要集中在`java.nio`包及其子包中,旨在提高文件操作的性能,增强并发处理,并引入了异步I/O...
六、高级I/O特性 Java NIO(New Input/Output)库提供了非阻塞I/O和通道(Channels)等高级特性,适用于高并发的I/O操作。`java.nio.file` 包提供了更现代的文件操作API,如 `Files.copy()`,`Files.lines()` 等方法...
Java NIO(New IO)是自Java 1.4引入的一个重要特性,提供了非阻塞I/O操作。NIO的核心组件包括通道(Channel)和选择器(Selector)。通道类似于流,但可以同时进行读写操作,且支持异步数据传输。选择器允许单线程...
在Java编程语言中,I/O(输入/输出)是程序与外部世界交互的重要部分,而标准输入输出流(System.in, System.out, System.err)是Java内置的预定义流,用于处理程序与操作系统之间的基本输入输出操作。这篇博客将深入...
标题与描述均提到了“java-jdk1.4新特性介绍”,这暗示了文章的核心将围绕Java JDK 1.4版本中的新增功能进行探讨。Java作为一款广泛使用的编程语言,其每一次更新都伴随着一系列的新特性和性能提升,而JDK 1.4也不...
本文将对 Java 中的高级核心知识进行全面解析,从基础知识到高级特性,全方位解析 Java 的核心技术。 一、Java 基础知识 1.1 Java 语言特点 * Java 语言是一种面向对象的编程语言,具有平台独立性、多线程、网络...
本书紧凑地审视了Java程序员在I/O方面通常面临的典型挑战,并指导读者如何利用新I/O特性的能力。读者将通过常见的、真实世界的I/O问题示例学习如何应用这些工具,并看到新特性如何直接提升响应性、可伸缩性和可靠性...
Java NIO,即Non-Blocking I/O,是Java在JDK 1.4引入的一套新的I/O API,旨在提供一种更加高效的方式来处理I/O操作,尤其是对于网络编程和高并发场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器...
1. **JDK7新特性<一>概述** JDK7的发布标志着对Java平台的一次重要升级。在这一部分,主要介绍了JDK7的基本情况,包括虚拟机对动态语言的支持和类文件的严格检查。动态语言支持使得Java虚拟机(JVM)能够更好地运行...
这份解析涵盖了JAVA的基础语法、面向对象编程、异常处理、集合框架、多线程、I/O流、网络编程等多个核心领域,是提升JAVA技能的重要辅助资料。 在JAVA基础语法部分,习题解析详细解释了变量声明、数据类型、运算符...
5. **输入/输出与NIO**:讲解Java的I/O流体系,包括字节流、字符流、对象序列化,以及非阻塞I/O(New I/O,NIO)框架的使用。 6. **多线程编程**:介绍线程的创建、同步、协作,以及线程池的使用。 7. **反射与...
集合框架、异常处理、多线程和I/O流是Java的重要组成部分。比如ArrayList和LinkedList是两种常见的列表实现,ArrayList基于动态数组,适合随机访问;LinkedList基于双向链表,适合插入和删除操作。 **3.3.1 线程与...
这种方式通常不需要特殊的驱动或库支持,而是利用Java的基本I/O功能直接读取DBF文件的内容。这种方法适用于简单的数据处理任务,但可能不适用于复杂的数据结构分析或大型数据集处理。 ### 将DBF文件当作表进行操作...
Volley是Google在2013年的I/O大会上推出的一款高效的Android网络通信框架,它专为Android应用设计,旨在简化网络请求的处理,提高应用程序的响应速度和用户体验。这款框架的核心理念是快速、高效和易用,使得开发者...
本书覆盖了Java语言的各个方面,包括多线程、网络编程、I/O、反射、序列化、安全、垃圾收集、JVM内部以及Java集合框架等核心高级主题。 1. **多线程**:Java的并发处理能力是其强大的特性之一。书中详细介绍了线程...
书中详细阐述了Java语言的高级特性,包括并发、网络、I/O、反射、安全、XML处理以及Java EE集成等内容,旨在帮助读者掌握Java编程的精髓,提升编程技巧和解决复杂问题的能力。 1. **并发编程**:Java提供了丰富的...
11. **NIO.2**:Java SE7扩展了非阻塞I/O(NIO),提供了文件系统路径、异步I/O操作和文件通道等新功能,增强了I/O性能。 12. **动态语言支持**:JDK 7增加了对动态语言的支持,如JSR 292,使得JVM可以更好地运行如...