日期:2014-05-20  浏览次数:20686 次

想不明白这个问题:JAVA IO
JAVA初学者,看到文件IO这一章。
关于IO和NIO,有个问题始终不明白。
书上说,传统IO是面向流的,即系统底层一次只能处理一个字节(符),效率不高;
而NIO是面向块的,采用内存映射文件使得输入输出效率很高。

我就不明白了,java.io系统底层一次只能处理一个字节(符),难道NIO底层一次不是只处理一个字节(符)吗?
学过汇编都知道,
mov ah,2h
int 21h

mov ah,9h
int 21h
DS:DX串首址
用来输出字符或字符串。
CPU只能一个一个地输出字符,你NIO底层怎么一次处理多个字符???

java.io除了一些InputStream、OutputStream字节流类是没有缓冲的,字符流类基本都带有缓冲。
NIO说是面向块的,不也是缓冲吗?
既然,都是缓冲,凭什么传统IO效率不高而NIO就很高呢?

说下,我个人的理解:
java.io缓冲是由系统自动分配的,对程序员来说是透明的(缓冲类除外);
而NIO缓冲可以指定大小,可以显式文件内存映射,能够根据输入输出自己调优。
所以传统IO慢,NIO快。

求高手指点一二,感激不尽!!
PS:不考虑阻塞等方面的差异。。。

------解决方案--------------------
你说的没错,其实系统本质是一样的,只是NIO将最耗时的I/O操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。
------解决方案--------------------
NIO很大程度上是为了处理并发情况下的IO需求,API大部分是非阻塞的。通知操作系统进行非阻塞的IO操作,而非虚拟机自己来做IO操作。我大概是这么认为的
------解决方案--------------------
两者区别主要在底层缓存处理上,并发异步处理上。