本篇主要介绍的是关于nio在文件读写方面的简单应用,具体底层实现原理,并未深究。
新的输入/输出(NIO)库是在JDK 1.4中引入的。它与原来的I/O库最重要的区别是数据打包和传输的方式的不同,原来的 I/O 以流 的方式处理数据,而 NIO 以块 的方式处理数据。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性。
示例代码:使用IO和NIO读取一个文件中的内容
从以上示例代码中,我们可以看到对于nio非常重要的两个核心概念:通道与缓冲区。
(1)通道 Channel是对原I/O包中的流的模拟,可以通过它读取和写入数据。拿NIO与原来的I/O做个比较,通道就像是流。 通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的子类), 而通道可以用于读、写或者同时用于读写。 因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在UNIX模型中,底层操作系统通道是双向的。
(2)缓冲区 在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问NIO中的数据,您都是将它放到缓冲区中。 缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不仅仅是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。 最常用的缓冲区类型是ByteBuffer。 一个ByteBuffer可以在其底层字节数组上进行get/set操作(即字节的获取和设置)。 ByteBuffer不是NIO中唯一的缓冲区类型。事实上,对于每一种基本Java类型都有一种缓冲区类型: ByteBuffer CharBuffer ShortBuffer
文件的读写
nio读取文件涉及三个步骤: (1) 从FileInputStream获取Channel。 (2) 创建Buffer。 (3) 将数据从Channel读到Buffer 中。
文件的写操作与读操作类似。
下面我以文件的拷贝为例,展示一下nio的读写过程:
关于nio更加详细深入研究请参考:http://zhangshixi.javaeye.com/category/101360
Powered by: BlogJava Copyright © jone