`

nio与io拷贝文件性能对比

    博客分类:
  • java
阅读更多
package my;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.Writer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
 
/**
 * 文件拷贝各种方式的比较
 * 
 */
public class TestFile {
 
     public final static String FILE_PATH ="D:\\电影\\[电影天堂www.dy2018.com]特殊身份BD中英双字.mkv";
 
    //public final static String FILE_PATH = "F:\\apache-tomcat-7.0.11\\webapps\\ROOT\\a.rar";
 
    public final static String FILE_PATH_OUT = "D:\\哈哈.mkv";
 
    public static void TransByCommonIoStream() throws Exception {
 
        long beginTime = System.currentTimeMillis();
 
        FileInputStream fis = new FileInputStream(new File(FILE_PATH));
 
        FileOutputStream fos = new FileOutputStream(new File(FILE_PATH_OUT));
 
        byte[] b = new byte[1024];
 
        int len = 0;
 
        while ((len = fis.read(b)) != -1) {
            fos.write(b, 0, len);
        }
 
        fos.flush();
 
        fis.close();
        fos.close();
 
        long endTime = System.currentTimeMillis();
 
        System.out.println("采用传统IO FileInputStream 读取,耗时:"
                + (endTime - beginTime));
 
    }
 
    public static void TransByCommonIoBufferedStream() throws Exception {
 
        long beginTime = System.currentTimeMillis();
 
        FileInputStream fis = new FileInputStream(new File(FILE_PATH));
 
        FileOutputStream fos = new FileOutputStream(new File(FILE_PATH_OUT));
 
        BufferedInputStream bis = new BufferedInputStream(fis);
 
        BufferedOutputStream bos = new BufferedOutputStream(fos);
 
        byte[] b = new byte[1024];
 
        int len = 0;
 
        while ((len = bis.read(b)) != -1) {
            bos.write(b, 0, len);
        }
 
        bos.flush();
 
        fis.close();
        fos.close();
        bis.close();
        bos.close();
 
        long endTime = System.currentTimeMillis();
 
        System.out.println("采用传统IO BufferedInputStream 读取,耗时:"
                + (endTime - beginTime));
 
    }
 
    public static void TransByCommonIoBuffered() throws Exception {
 
        long beginTime = System.currentTimeMillis();
 
        Reader br = new BufferedReader(new FileReader(new File(FILE_PATH)));
        Writer bw = new BufferedWriter(new FileWriter(new File(FILE_PATH_OUT)));
 
        char[] c = new char[1024];
 
        int len = 0;
 
        while ((len = br.read(c)) != -1) {
            bw.write(c, 0, len);
        }
 
        bw.flush();
        br.close();
        bw.close();
 
        long endTime = System.currentTimeMillis();
 
        System.out.println("采用传统IO  BufferedReader 读取,耗时:"
                + (endTime - beginTime));
    }
 
    public static void TransByRandomAccFile() throws Exception {
 
        long beginTime = System.currentTimeMillis();
 
        FileInputStream fis = new FileInputStream(new File(FILE_PATH));
 
        RandomAccessFile raf = new RandomAccessFile(new File(FILE_PATH_OUT),
                "rw");
 
        byte[] b = new byte[1024];
 
        int len = 0;
 
        while ((len = fis.read(b)) != -1) {
            raf.write(b, 0, len);
        }
 
        long endTime = System.currentTimeMillis();
 
        System.out.println("采用传统IO RandomAccessFile 读取,耗时:"
                + (endTime - beginTime));
 
    }
 
    /**
     * 采用FileChannel 自带方法测试 public abstract long
     * transferFrom(ReadableByteChannel src, long position, long count) throws
     * IOException;
     */
    public static void TransByNioFileChannel() throws Exception {
 
        long beginTime = System.currentTimeMillis();
 
        FileChannel fc = new FileInputStream(new File(FILE_PATH)).getChannel();
 
//        FileChannel fco = new RandomAccessFile(new File(FILE_PATH_OUT), "rw").getChannel();
        FileChannel fco = new FileOutputStream(new File(FILE_PATH_OUT)).getChannel();
 
        fco.transferFrom(fc, 0, fc.size());
 
        long endTime = System.currentTimeMillis();
 
        System.out.println("采用NIO FileChannel 自带方法  读取,耗时:"
                + (endTime - beginTime));
    }
 
    public static void TransByNioFileChannelCommon() throws Exception {
 
        long beginTime = System.currentTimeMillis();
 
        FileChannel fc = new FileInputStream(new File(FILE_PATH)).getChannel();
 
        FileChannel fco = new RandomAccessFile(new File(FILE_PATH_OUT), "rw")
                .getChannel();
 
        ByteBuffer buf = ByteBuffer.allocate(1024);
 
        while (fc.read(buf) != -1) {
            buf.flip();
            fco.write(buf);
            buf.clear();
        }
 
        long endTime = System.currentTimeMillis();
 
        System.out.println("采用NIO FileChannel 循环 读取,耗时:"
                + (endTime - beginTime));
    }
 
    public static void deleteFile() {
        File f = new File(FILE_PATH_OUT);
        if (f.exists())
            f.delete();
    }
 
    public static void main(String[] args) throws Exception {
 
        TransByCommonIoStream();
        deleteFile();
        TransByCommonIoBufferedStream();
        deleteFile();
        TransByRandomAccFile();
        deleteFile();
        TransByNioFileChannel();
        deleteFile();
        TransByNioFileChannelCommon();
        deleteFile();
    }
}

/**测试结果*/
采用传统IO FileInputStream 读取,耗时:11393
采用传统IO BufferedInputStream 读取,耗时:1191
采用传统IO RandomAccessFile 读取,耗时:2929
采用NIO FileChannel 自带方法  读取,耗时:485
采用NIO FileChannel 循环 读取,耗时:2502
分享到:
评论

相关推荐

    NIO与零拷贝_javanio_nio和零拷贝_

    总的来说,Java NIO与零拷贝技术的结合,为开发者提供了更高效率、更低资源消耗的I/O处理手段,尤其在处理大数据和高并发场景时,其优势更为明显。理解并掌握这些知识,对于提升Java应用程序的性能至关重要。

    io+nio拷贝及nio按行读取

    使用 io和nio 各个方式进行文件拷贝; 使用nio+byteBuffer 实现按行读取文件(大文件),在window/linux/macOS上均测试通过,对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com

    JavaNIO与IO的区别和比较.pdf

    传统的IO操作通常直接在流与数据源之间进行,而NIO则引入了缓冲区,数据先被写入缓冲区,再由缓冲区批量读写到通道或文件中。这样减少了数据拷贝次数,提高了效率。Buffer提供了诸如容量、限制、位置等概念,方便了...

    java使用nio2拷贝文件的示例

    在Java中,NIO2(New IO 2)是Java 7引入的一组新API,极大地扩展了Java的I/O功能,特别是在文件操作方面。NIO2引入了许多改进,包括异步文件操作、文件系统感知以及更强大的文件拷贝功能。本示例将详细讲解如何使用...

    java 使用IO流实现文件的复制

    NIO引入了通道(Channel)和缓冲区(Buffer)的概念,可以实现多线程间的零拷贝,提高文件复制效率。例如,使用`FileChannel`进行文件复制的代码如下: ```java import java.io.IOException; import java.nio....

    JAVA 的IO流的文件复制

    - 复制大文件时,可能需要考虑使用缓冲区优化性能,例如增加缓冲区大小或使用NIO(New IO)的`FileChannel`进行更高效的传输。 - 文件复制过程中应考虑到并发控制,特别是在多线程环境中,避免文件操作冲突。 总结...

    MavenUtil 文件拷贝

    1. **文件操作**:在Java中,我们可以使用`java.io`或`java.nio`包下的类进行文件操作。例如,`File`类用于文件和目录路径名的表示,`FileInputStream`和`FileOutputStream`用于读写文件,`Files`类提供了一套静态...

    Java无敌 基于网络的文件拷贝

    6. **性能优化**:当拷贝数千个文件时,一次性处理所有文件可能导致内存溢出。因此,可以采用多线程或异步处理,分批处理文件,以降低内存压力。另外,合理设置缓冲区大小,根据网络带宽和服务器性能调整,以达到...

    使用jdk7的nio2操作文件拷贝和剪切示例

    在这个示例中,我们将深入探讨如何使用NIO.2进行文件和目录的拷贝与移动操作。 首先,`copeOrMoveFile`方法接受源文件路径、目标路径以及操作类型(拷贝或移动)。它通过调用`realCopeOrMoveFile`方法来执行实际...

    实例83_文件操作_拷贝文件.rar_实例文件操

    确保在拷贝文件时不会破坏原始数据,同时优化拷贝速度,可以提高整体的程序性能。此外,对于网络文件拷贝,还涉及到网络协议(如FTP、SFTP、HTTP/HTTPS)和安全性问题,需要考虑加密和身份验证。 总之,“实例83_...

    java 递归拷贝文件显示进度demo

    进度显示的关键在于跟踪已拷贝的文件数量或大小,与总数量或总大小进行比较。可能的实现方式是在每次成功拷贝一个文件后,增加一个计数器或者累加文件大小,然后根据这个比例更新进度条或百分比。这通常需要一个...

    IO和NIO区别共1页.pdf.zip

    1. 阻塞与非阻塞:IO是阻塞的,而NIO是非阻塞的。IO在读写过程中会阻塞线程,直到操作完成;NIO则允许线程在等待数据时去做其他事情,提高系统效率。 2. 缓冲区:IO直接对流进行读写,而NIO引入了缓冲区概念,数据...

    IO进程线程Day5 文件夹拷贝 从文件中读取数据到内存,从内存写入到文件 父子进程发送消息

    今天我们将深入探讨“IO进程线程Day5”中的核心知识点,包括文件夹拷贝、从文件读取数据到内存以及内存到文件的写入,以及父子进程间的消息传递。 首先,让我们关注文件夹拷贝这一过程。文件夹拷贝不仅仅是简单的...

    拷贝文件及文件夹(封装工具类)

    在拷贝单个文件时,我们可以使用`java.nio.file.Files`类提供的`copy()`方法,它提供了简单且高效的文件复制功能。但若要拷贝整个目录及其子目录,我们需要递归处理每个文件和子目录。以下是一个基础的文件拷贝工具...

    Java二进制IO类与文件复制操作实例

    上述代码虽然能完成文件复制,但每次只读取和写入1KB的数据,可能会比较慢。通过使用缓冲流(如`BufferedInputStream`和`BufferedOutputStream`),我们可以一次性读取和写入更大的数据块,从而提高效率。 6. **...

    java 局域网拷贝文件

    要实现局域网文件拷贝,我们需要使用Java的I/O流(InputStream和OutputStream)以及网络套接字(Socket)或NIO(New IO)的FileChannel。以下是一个简单的步骤概述: 1. **确定目标路径**:获取局域网内目标文件的...

Global site tag (gtag.js) - Google Analytics