这几天在看JAVA nio相关的东西,网上资料说nio是非阻塞的,我实在理解不到这句话的意思;
比如我用nio来复制文件,那一句代码表示非阻塞呢?我冥思苦想,实在想不出。
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");
}
其实我犯了一个错误,其实网上大家所说的nio非阻塞的默认场景都是网络编程这一块,因为大家举的例子都是什么ServerSocketChannel,SocketChannel;(以上用nio复制文件的操作我完全没有看出来什么地方有非阻塞)
绕了一大大圈子,其实大家口中所说的非阻塞都是在通信过程中发送和接收信息;
对比ServerSocket/Socket(流/IO)编程和ServerSocketChannel/SocketChannel(nio)编程
我们看前者服务端代码中往往会新建一个单独的线程去处理获得的请求(这都是默认代码的写法了,网上都这么写),然后使用while((info=br.readLine())!=null)来判断客户端是否有输入,这就是实际阻塞的地方。
使用后者(nio)编程时,其实现机制是代码中循环的去判断通道中是否有信息到达,然后再去调用对应的方法及分支处理信息;
但我认为这都是设计上的问题(代码写法的问题)
前者我觉得也可以完全不写成用多线程来处理,服务端可以把所有获得的socket对象放在一个集合里,然后轮询里面每个socket是否有数据接收再调用对应的方法,这就跟nio一贯代码写法有点类似了
这里的什么阻塞和非阻塞我理解都是代码设计上的东西,谁叫你那么写代码呢;
关注点
其实我们关注nio应该更多的关注的是,Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。
阻塞与非阻塞我觉得这篇文章写得不错
http://blog.csdn.net/robinjwong/article/details/41786919