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

IO
 read 或者write,如果没有数据可以读写,一直block
需要依赖启动很多线程去处理大量的connection,不断pooling connection状态 ,资源消耗比较大
NIO
线程可以请求数据写入Channel,不必等待写完,中间可以处理其他Channel。一个线程可以处理多个Channel的输入输出,主要依赖selector实现
可以监听任意多个Channel,任意感兴趣的事件。不需要pooling,需要启动很多线程。 主要也是依赖selector实现

3. IO vs  NIO  api

Sample code using standard IO

import 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
原创粉丝点击