java.nio这个包是自从JDK1.4开始引入的,NIO是new io的缩写,这个包提供更好的I/O性能。这个包提供了对基本类型的缓冲,提供I/O抽象Channels及新的多元的(multiplexed)、字符集的编码器和解码器、非阻塞(non-blocking)的I/O机制。
NIO API主要集中在java.nio和它的subpackages中:
java.nio
定义了Buffer及其数据类型相关的子类。其中被java.nio.channels中的类用来进行IO操作的ByteBuffer的作用非常重要。
java.nio.channels
定义了一系列处理IO的Channel接口以及这些接口在文件系统和网络通讯上的实现。通过Selector这个类,还提供了进行异步IO操作的办法。这个包可以说是NIO API的核心。
java.nio.channels.spi
定义了可用来实现channel和selector API的抽象类。
java.nio.charset
定义了处理字符编码和解码的类。
java.nio.charset.spi
定义了可用来实现charset API的抽象类。
java.nio.channels.spi和java.nio.charset.spi这两个包主要被用来对现有NIO API进行扩展,在实际的使用中,我们一般只和另外的3个包打交道。下面将对这3个包一一介绍。
上面列的那些包基本不会使用,因为他们只是提供这些特性的支持,而你使用这些特性根本不需要你去了解它是怎么实现的,我们只需要根据他提供的api来实现相应的功能即可。
在java.io包里面提供的FileInputStream等类都提供了getChannels、close等方法。在java.net包里面的一些类也做了相应的改变。
在nio里面,比较重要的一个接口就是Channel,先看一下JDK对这个接口的描述:
通道表示到实体,如硬件设备、文件、网络套接字或可以执行一个或多个不同 I/O 操作(如读取或写入)的程序组件的开放的连接。
通道可处于打开或关闭状态。创建通道时它处于打开状态,一旦将其关闭,则保持关闭状态。一旦关闭了某个通道,试图对其调用 I/O 操作就会导致 ClosedChannelException 被抛出。通过调用通道的 isOpen 方法可测试通道是否处于打开状态。
正如扩展和实现此接口的各个接口和类规范中所描述的,一般情况下通道对于多线程的访问是安全的。
这个接口只提供了两个方法:
close()
关闭此通道。
isOpen()
判断此通道是否处于打开状态。
这篇文章只介绍nio在网络和文件io方面的应用,下面只介绍FileChannel、ServerChannel和SocketChannel。
在文件io上的应用
FileChannel接口介绍:
用于读取、写入、映射和操作文件的通道。
常用的有下面几个方法:
lock()
获取对此通道的文件的独占锁定。
position()
设置此通道的文件位置。
read(ByteBuffer dst)
将字节序列从此通道读入给定的缓冲区。
size()
返回此通道的文件的当前大小。
transferFrom(ReadableByteChannel src, long position, long count)
将字节从给定的可读取字节通道传输到此通道的文件中。
transferTo(long position, long count, WritableByteChannel target)
将字节从此通道的文件传输到给定的可写入字节通道。
write(ByteBuffer src)
将字节序列从给定的缓冲区写入此通道。
下面给出一个文件复制的一个实例,代码如下:
public static void copyFileUsingNIO(String src, String dest)
throws Exception {
FileInputStream srcStream = new FileInputStream(src);
FileOutputStream destStream = new FileOutputStream(dest);
FileChannel inChannel=srcStream.getChannel();
FileChannel outChannel=destStream.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
inChannel.close();
outChannel.close();
srcStream.close();
destStream.close();
}
从上面可以看出在文件io中使用nio相当简单,只需要取得通道,然后传输就可以了。当然,也可以自己指定使用的buffer,使用read和write方法来操作io。
关于网络io方面下次介绍。
分享到:
相关推荐
java NIO的基本知识点学习笔记,不包含具体代码
javaNIO学习笔记(csdn)————程序
java学习笔记1(java io/nio)设计模式
NULL 博文链接:https://zheng12tian.iteye.com/blog/1094811
IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的... (c 的 printf scanf,java 的面向对象封装 )
Nio学习笔记
Contents: 1 核心概念以及基本读写 2 缓冲区的实现机制 3 连网与异步IO 4 分散和聚集IO 5 文件锁定
自己总结的java中NIO的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
尚硅谷java教程全程跟听,手动整理,从面向对象开始按章节按课时整理,适合对照视频作为笔试使用/java知识脉络梳理/八股理解背诵
JAVA学习笔记,包含JAVA编程思想,JAVA多线程设计模式,JAVA网络编程,以及JAVA NIO,适合初学者学习JAVA语言及项目开发模式
《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...
java_Java_学习笔记.pdf Java_Performance.pdf java代码效率优化.docx Java内存模型的历史变迁.docx Java在游戏服务器开发中的应用.docx java基础总结大全.txt Java开发与技术挑战——关于技术的技术思考.docx Java...
Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...
1.学习时的一个聊天室程序,将服务端改为NIO机制 2.支持多人同时在线局域网聊天 3.知识面:JSwing,NIO,消息包加密,解密,单列模式的线程安全机制等.
学习笔记(持续更新中) 所有文章均同步发布到微信公众号【JavaRobot】,关注微信公众号,及时得到文章推送,谢谢支持。 说明:如无特别说明,所有代码都基于JDK8 JavaSE(Java基础) Java Core 关键字 synchronized...
丰富的MINA实例介绍,java NIO 学习,mina快速入门宝典
java_Java_学习笔记.pdf Java_Performance.pdf java代码效率优化.docx Java内存模型的历史变迁.docx Java在游戏服务器开发中的应用.docx java基础总结大全.txt Java开发与技术挑战——关于技术的技术思考.docx Java...
未来会详细整理到javaNIO基础前置笔记网上搜集。 网上搜集网上搜集停止更新,还是官方文档好用网上搜集基础上进行补充整理网上搜集基础上进行补充整理网上搜集基础上进行补充整理网上搜集待整理进行中数据库笔记...
Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助...它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。
Java 的学习笔记和整理的知识点,包含Java语言基础、Java服务端方向的框架、设计模式、计算机网络、算法、Java 虚拟机和数据库等多个方面的内容。想了解前端的内容参考,Android相关的内容参考。 目录结构 语言基础...