java IO/ NIO difference
来源:互联网 发布:javlib最新域名 2016 编辑:程序博客网 时间:2024/06/08 18:21
1. IO Stream vs NIO block
最重要的区别, IO处理数据主要通过Steam(一次处理一个或者多个字节),而NIO处理数据通过block。IO:
一次处理一个或者多个字节
较容易创建filter ,对stream数据过滤
不cache字节数据
不能再stream中前后移动数据,如果需要,必须借助bufferReader bufferWrite
NIO
一次处理一个block,速度比一个或者多个字节块
可以在buffer中移动数据,更加灵活,但是数据处理增加难度,需要判断buffer中是否包含全部期待的数据。另外,读取数据进入buffer,不能覆盖buffer中未读取的数据。所以更适用于请求多,数据体不大的场景?
2. Synchronous vs. Asynchronous IO
IOread 或者write,如果没有数据可以读写,一直block
需要依赖启动很多线程去处理大量的connection,不断pooling connection状态 ,资源消耗比较大
NIO
线程可以请求数据写入Channel,不必等待写完,中间可以处理其他Channel。一个线程可以处理多个Channel的输入输出,主要依赖selector实现
可以监听任意多个Channel,任意感兴趣的事件。不需要pooling,需要启动很多线程。 主要也是依赖selector实现
3. IO vs NIO api
Sample code using standard IOimport java.io.BufferedReader;import java.io.FileReader;import java.io.IOException; public class WithoutNIOExample{ public static void main(String[] args) { BufferedReader br = null; String sCurrentLine = null; try { br = new BufferedReader( new FileReader("test.txt")); while ((sCurrentLine = br.readLine()) != null) { System.out.println(sCurrentLine); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) br.close(); } catch (IOException ex) { ex.printStackTrace(); } } }}
import java.io.IOException;import java.io.RandomAccessFile;import java.nio.ByteBuffer;import java.nio.channels.FileChannel; public class ReadFileWithFixedSizeBuffer{ public static void main(String[] args) throws IOException { RandomAccessFile aFile = new RandomAccessFile ("test.txt", "r"); FileChannel inChannel = aFile.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while(inChannel.read(buffer) > 0) { buffer.flip(); for (int i = 0; i < buffer.limit(); i++) { System.out.print((char) buffer.get()); } buffer.clear(); // do something with the data and clear/compact it. } inChannel.close(); aFile.close(); }}
4. 总结
NIO允许用一个或者更少的线程管理多个Channel,相比IO具有更快的速度。但是NIO在数据处理方面比IO复杂
如果需要管理大量连接,并且数据比较少,例如聊天服务器,NIO具有优势。再比如,需要开发大量连接,用一个线程管理大量对外开放连接,p2p网络中,NIO也具有优势
如果连接数不大,发送数据量较大,IO是个不错的选择
0 0
- java IO/ NIO difference
- 【IO/NIO】Java IO/NIO
- 【IO/NIO】Java NIO浅析
- java IO & NIO
- Java NIO vs. IO
- Java NIO vs. IO
- Java NIO vs. IO
- JAVA IO/NIO简介
- java io和nio
- Java IO NIO AIO
- Java NIO与IO
- Java NIO与IO
- Java NIO与IO
- java NIO vs IO
- Java NIO与IO
- Java NIO vs. IO
- java文件io、nio
- java IO和NIO
- Container With Most Water容器盛水
- 如何自己实现模板类(简单案例——顺序表)
- 【转】使用Akka、Kafka和ElasticSearch等构建分析引擎
- 【iOS】单元测试
- Stanford机器学习---第七讲. 机器学习系统设计
- java IO/ NIO difference
- 基于QT:温度串口图像显示
- do_mpage_readpage函数详细分析
- POJ2546
- Stanford机器学习---第八讲. 支持向量机SVM
- UIView的重绘机制——drawRect
- OpenSceneGraph实现的NeHe OpenGL教程 - 第四十课
- 拆轮子系列:拆 OkHttp
- Python快速学习第九天--安装并操作Mysql数据库