为什么说JAVA nio是非阻塞的

万物皆字节 2017-08-26 07:18:04

就拿复制文件来说,我看了好多资料都没有看懂到底哪里是非阻塞了。
public static void main(String[] args) throws Exception {

File src = new File("D:\\tool/iToolsSetup_4.2.0.6.exe");
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(new File("D:/iToolsSetup_4.2.0.6.exe"));

ByteBuffer buffer = ByteBuffer.allocate(1024);

FileChannel channelin = fis.getChannel();
FileChannel channelout = fos.getChannel();

while (channelin.read(buffer) != -1) {
System.out.println("--");
buffer.flip();
channelout.write(buffer);
buffer.clear();
}

fis.close();
fos.close();
System.out.println("over");
}
...全文
743 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
pilnyun335857183 2017-08-29
  • 打赏
  • 举报
回复
NIO就是非阻塞IO(直译)。非阻塞的意思就是调用是实时返回的不会导致当前线程被挂起(阻塞),比如对一个通道进行read操作nio下如果通道中没有可读数据会直接返回只不过返回值是0,而BIO(阻塞IO)下则会等到通道中有数据才会返回;相信这个你应该是理解的。但是IO中有个特例就是File IO,因为文件是确定的 而且文件句柄在操作系统中是不能同时被多个线程持有的(多个线程不能同时读写同一个文件,虽然java中有些API声称可以同时操作 只不过是底层实现每次操作都获取一次句柄释放一次句柄而已),所以呢File IO你可以理解为都是非阻塞的,因为read时候文件里面有数据就读数据返回 没数据就是EOF。

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧