IO和NIO性能差异和示例

时间:2013-04-17 11:34:19

标签: java java-ee io nio

我是Java NIO的新手,没有动手。关于Java NIO,我所知道的是它比java.IO快。

所以,只是试一试,我想为...编写简单的程序 “将一个文件的内容复制到另一个文件”。 “从大文件中搜索一个单词”。

同时使用java.io和java.nio包。

另外,我分别在操作开始和结束之前和之后打印了时间。

我没有发现任何差异,因为NIO更快。我可能会走错方向。

任何人都可以指导我完成通过示例正确看到差异的场景吗?

编辑:

我很惊讶地知道这个问题会得到反对票。 我已经提到我是NIO的新手并指导我,如果我走向错误的方向。 我没有发布一个程序,因为它是非常基本的读写操作...请参阅下面我用来测试的程序....

使用IO

public static void copyFile(File in, File out) throws Exception {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    Date now = new Date();
    String strDate = sdf.format(now);

    System.out.println("Before Read :"+strDate);


    FileInputStream fis  = new FileInputStream(in);
    FileOutputStream fos = new FileOutputStream(out);
    try {
        byte[] buf = new byte[1024];
        int i = 0;
        while ((i = fis.read(buf)) != -1) {
            fos.write(buf, 0, i);
        }
    } 
    catch (Exception e) {
        throw e;
    }
    finally {
        if (fis != null) fis.close();
        if (fos != null) fos.close();
    }

    Date now1 = new Date();
    String strDate1 = sdf.format(now1);

    System.out.println("After Read :"+strDate1);


}

使用NIO

 public static void copyFile(File in, File out) 
        throws IOException 
{

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    Date now = new Date();
    String strDate = sdf.format(now);

    System.out.println("Before Read :"+strDate);

    FileChannel inChannel = new
        FileInputStream(in).getChannel();
    FileChannel outChannel = new
        FileOutputStream(out).getChannel();
    try {
        inChannel.transferTo(0, inChannel.size(),
                outChannel);
    } 
    catch (IOException e) {
        throw e;
    }
    finally {
        if (inChannel != null) inChannel.close();
        if (outChannel != null) outChannel.close();
    }

    Date now1 = new Date();
    String strDate1 = sdf.format(now1);

    System.out.println("After Read :"+strDate1);
}

我从一个文件复制到另一个文件的文件大约是20 MB。

2 个答案:

答案 0 :(得分:5)

NIO允许您仅使用一个(或更少)线程来管理多个通道,但成本是解析数据可能比使用标准IO从阻塞流中读取数据时更复杂。

如果您需要同时管理数千个打开的连接,每个只发送一些数据,例如聊天服务器,在NIO中实现服务器可能是一个优势。同样,如果您需要与其他计算机保持大量打开的连接,例如在P2P网络中,使用单个线程来管理所有出站连接可能是一个优势。

如果您的带宽较少且一次发送大量数据,则应选择标准IO服务器实现。

参考:Difference between standard IO and NIO

答案 1 :(得分:3)