分别使用BIO和NIO来实现文件的拷贝并比较两者的效率

1. 本期竞争者有四位,分别是:

第一位:FileInputStream+FileOutputStream(BIO);

第二位:BufferedFileInputStream+BufferedFileOutputStream(BIO);

第三位:ByteBuffer+Channel(NIO);

第四位:MappedByteBuffer+Channel(NIO);

2. 分别实现文件拷贝操作:

第一位:FileInputStream+FileOutputStream:

    public void BIO_one() throws IOException {
        FileInputStream fin = new FileInputStream(new File(source));
        FileOutputStream fout = new FileOutputStream(new File(dest+"BIO_one.txt"));

        byte[] buf = new byte[1024];
        while (fin.read(buf) != -1){
            fout.write(buf);
        }
        fin.close();
        fout.close();
    }

第二位:BufferedFileInputStream+BufferedFileOutputStream:

    public void BIO_two() throws IOException {
        FileInputStream fin = new FileInputStream(new File(source));
        FileOutputStream fout = new FileOutputStream(new File(dest+"BIO_two.txt"));

        BufferedInputStream bfin = new BufferedInputStream(fin);
        BufferedOutputStream bfout = new BufferedOutputStream(fout);

        byte[] buf = new byte[1024];
        while (bfin.read(buf) != -1){
            bfout.write(buf);
        }
        bfin.close();
        bfout.close();
        fin.close();
        fout.close();
    }

第三位:ByteBuffer+Channel:

    public void NIO_one() throws IOException {
        FileInputStream fin = new FileInputStream(new File(source));
        FileOutputStream fout = new FileOutputStream(new File(dest+"NIO_one.txt"));

        FileChannel fcin = fin.getChannel();
        FileChannel fcout = fout.getChannel();

        ByteBuffer buf = ByteBuffer.allocate(1024);
        while (true){
            buf.clear();
            if (fcin.read(buf) == -1)
                break;
            buf.flip();
            fcout.write(buf);
        }
        fcin.close();
        fcout.close();
        fin.close();
        fout.close();
    }

第四位:MappedByteBuffer+Channel:

    public void NIO_two() throws IOException {
        FileInputStream fin = new FileInputStream(new File(source));
        FileOutputStream fout = new FileOutputStream(new File(dest+"NIO_two.txt"));

        FileChannel fcin = fin.getChannel();
        FileChannel fcout = fout.getChannel();

        MappedByteBuffer map = fcin.map(FileChannel.MapMode.READ_ONLY, 0, fcin.size());
        fcout.write(map);

        fcin.close();
        fcout.close();
        fin.close();
        fout.close();
    }

3. 源文件为红楼梦,当执行完时运行效果如下:

分别使用BIO和NIO来实现文件的拷贝并比较两者的效率_第1张图片

分别使用BIO和NIO来实现文件的拷贝并比较两者的效率_第2张图片BIO_one.txt

分别使用BIO和NIO来实现文件的拷贝并比较两者的效率_第3张图片BIO_two.txt

分别使用BIO和NIO来实现文件的拷贝并比较两者的效率_第4张图片NIO_one.txt

分别使用BIO和NIO来实现文件的拷贝并比较两者的效率_第5张图片NIO_two.txt

完事后发现BIO复制的文件多了6行,原来是read返回-1时,byte数组可能处于未读满的状态,导致后面的数据没有被覆盖,所以又写了一遍,我打印出byte的内容:

分别使用BIO和NIO来实现文件的拷贝并比较两者的效率_第6张图片

果然发现悼红轩往后出现了两遍,而NIO有clear操作避免了这样的情况。

根据输出结果发现NIO总体比BIO效率要高,而BufferedInputStream效率也很不错。

你可能感兴趣的:(Java基础)