
NIO 是non-blocking的简称,在jdk1.4 里提供的新api 。Sun 官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持。字符集编码解码解决方案。 Channel :一个新的原始I/O 抽象。 支持锁和内存映射文件的文件访问接口。 提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O 。
在分析公司前辈写的项目,无意中发现了其中使用到了Java nio相关的东西。于是这几天就在学习Java nio,也看了Ron Hitchens著的《Java NIO》这本书。
复制文件
先来看一个例子:以复制一个大小为2.5M的apk文件为例。
- 传统IO的方式
1 | long startTime = System.currentTimeMillis(); |
调用,输出:
1 | 10-08 21:09:23.970 2575-2575/com.shoewann.demo D/MainActivity: 传统IO方式:耗时94ms |
传统IO的方式:耗时94ms
- NIO通道的方式
1 | long startTime = System.currentTimeMillis(); |
调用,输出:
1 | 10-08 21:09:26.103 2575-2575/com.shoewann.demo D/MainActivity: nio通道方式:耗时79ms |
NIO通道的方式:耗时79ms
速度比传统IO的方式快,当然比起NIO通道复制,下面的这种内存映射的方式还更快
- 内存映射的方式
1 | long startTime = System.currentTimeMillis(); |
调用,输出:
1 | 10-08 21:09:28.168 2575-2575/com.shoewann.demo D/MainActivity: 内存映射文件方式:耗时35ms |
内存映射的方式:耗时35ms
通过以上的示例,可以看出对文件进行复制操作,内存映射文件的方式是最快的,nio通道方式仅次其后,传统IO方式相对前面两种较慢。但是,内存映射文件和nio通道的方式都是基于传统IO的方式进行衍生而来。
读文件
1 | RandomAccessFile rRaf = new RandomAccessFile(file, "r"); |
写文件
1 | RandomAccessFile wRaf = new RandomAccessFile(file, "rw"); |
以上就是Android中使用Nio通道与内存映射的示例,如有不足,欢迎指正,谢谢。