nio和io拷贝文件性能对比

代码如下:

  1 package my;
  2
  3 import java.io.BufferedInputStream;
  4 import java.io.BufferedOutputStream;
  5 import java.io.BufferedReader;
  6 import java.io.BufferedWriter;
  7 import java.io.File;
  8 import java.io.FileInputStream;
  9 import java.io.FileOutputStream;
 10 import java.io.FileReader;
 11 import java.io.FileWriter;
 12 import java.io.RandomAccessFile;
 13 import java.io.Reader;
 14 import java.io.Writer;
 15 import java.nio.ByteBuffer;
 16 import java.nio.channels.FileChannel;
 17
 18 /**
 19  * 文件拷贝各种方式的比较
 20  *
 21  */
 22 public class TestFile {
 23
 24      public final static String FILE_PATH ="D:\\电影\\[电影天堂www.dy2018.com]特殊身份BD中英双字.mkv";
 25
 26     //public final static String FILE_PATH = "F:\\apache-tomcat-7.0.11\\webapps\\ROOT\\a.rar";
 27
 28     public final static String FILE_PATH_OUT = "D:\\哈哈.mkv";
 29
 30     public static void TransByCommonIoStream() throws Exception {
 31
 32         long beginTime = System.currentTimeMillis();
 33
 34         FileInputStream fis = new FileInputStream(new File(FILE_PATH));
 35
 36         FileOutputStream fos = new FileOutputStream(new File(FILE_PATH_OUT));
 37
 38         byte[] b = new byte[1024];
 39
 40         int len = 0;
 41
 42         while ((len = fis.read(b)) != -1) {
 43             fos.write(b, 0, len);
 44         }
 45
 46         fos.flush();
 47
 48         fis.close();
 49         fos.close();
 50
 51         long endTime = System.currentTimeMillis();
 52
 53         System.out.println("采用传统IO FileInputStream 读取,耗时:"
 54                 + (endTime - beginTime));
 55
 56     }
 57
 58     public static void TransByCommonIoBufferedStream() throws Exception {
 59
 60         long beginTime = System.currentTimeMillis();
 61
 62         FileInputStream fis = new FileInputStream(new File(FILE_PATH));
 63
 64         FileOutputStream fos = new FileOutputStream(new File(FILE_PATH_OUT));
 65
 66         BufferedInputStream bis = new BufferedInputStream(fis);
 67
 68         BufferedOutputStream bos = new BufferedOutputStream(fos);
 69
 70         byte[] b = new byte[1024];
 71
 72         int len = 0;
 73
 74         while ((len = bis.read(b)) != -1) {
 75             bos.write(b, 0, len);
 76         }
 77
 78         bos.flush();
 79
 80         fis.close();
 81         fos.close();
 82         bis.close();
 83         bos.close();
 84
 85         long endTime = System.currentTimeMillis();
 86
 87         System.out.println("采用传统IO BufferedInputStream 读取,耗时:"
 88                 + (endTime - beginTime));
 89
 90     }
 91
 92     public static void TransByCommonIoBuffered() throws Exception {
 93
 94         long beginTime = System.currentTimeMillis();
 95
 96         Reader br = new BufferedReader(new FileReader(new File(FILE_PATH)));
 97         Writer bw = new BufferedWriter(new FileWriter(new File(FILE_PATH_OUT)));
 98
 99         char[] c = new char[1024];
100
101         int len = 0;
102
103         while ((len = br.read(c)) != -1) {
104             bw.write(c, 0, len);
105         }
106
107         bw.flush();
108         br.close();
109         bw.close();
110
111         long endTime = System.currentTimeMillis();
112
113         System.out.println("采用传统IO  BufferedReader 读取,耗时:"
114                 + (endTime - beginTime));
115     }
116
117     public static void TransByRandomAccFile() throws Exception {
118
119         long beginTime = System.currentTimeMillis();
120
121         FileInputStream fis = new FileInputStream(new File(FILE_PATH));
122
123         RandomAccessFile raf = new RandomAccessFile(new File(FILE_PATH_OUT),
124                 "rw");
125
126         byte[] b = new byte[1024];
127
128         int len = 0;
129
130         while ((len = fis.read(b)) != -1) {
131             raf.write(b, 0, len);
132         }
133
134         long endTime = System.currentTimeMillis();
135
136         System.out.println("采用传统IO RandomAccessFile 读取,耗时:"
137                 + (endTime - beginTime));
138
139     }
140
141     /**
142      * 采用FileChannel 自带方法测试 public abstract long
143      * transferFrom(ReadableByteChannel src, long position, long count) throws
144      * IOException;
145      */
146     public static void TransByNioFileChannel() throws Exception {
147
148         long beginTime = System.currentTimeMillis();
149
150         FileChannel fc = new FileInputStream(new File(FILE_PATH)).getChannel();
151
152 //        FileChannel fco = new RandomAccessFile(new File(FILE_PATH_OUT), "rw").getChannel();
153         FileChannel fco = new FileOutputStream(new File(FILE_PATH_OUT)).getChannel();
154
155         fco.transferFrom(fc, 0, fc.size());
156
157         long endTime = System.currentTimeMillis();
158
159         System.out.println("采用NIO FileChannel 自带方法  读取,耗时:"
160                 + (endTime - beginTime));
161     }
162
163     public static void TransByNioFileChannelCommon() throws Exception {
164
165         long beginTime = System.currentTimeMillis();
166
167         FileChannel fc = new FileInputStream(new File(FILE_PATH)).getChannel();
168
169         FileChannel fco = new RandomAccessFile(new File(FILE_PATH_OUT), "rw")
170                 .getChannel();
171
172         ByteBuffer buf = ByteBuffer.allocate(1024);
173
174         while (fc.read(buf) != -1) {
175             buf.flip();
176             fco.write(buf);
177             buf.clear();
178         }
179
180         long endTime = System.currentTimeMillis();
181
182         System.out.println("采用NIO FileChannel 循环 读取,耗时:"
183                 + (endTime - beginTime));
184     }
185
186     public static void deleteFile() {
187         File f = new File(FILE_PATH_OUT);
188         if (f.exists())
189             f.delete();
190     }
191
192     public static void main(String[] args) throws Exception {
193
194         TransByCommonIoStream();
195         deleteFile();
196         TransByCommonIoBufferedStream();
197         deleteFile();
198         TransByRandomAccFile();
199         deleteFile();
200         TransByNioFileChannel();
201         deleteFile();
202         TransByNioFileChannelCommon();
203         deleteFile();
204     }
205 }

测试结果:

1 采用传统IO FileInputStream 读取,耗时:11393
2 采用传统IO BufferedInputStream 读取,耗时:1191
3 采用传统IO RandomAccessFile 读取,耗时:2929
4 采用NIO FileChannel 自带方法  读取,耗时:485
5 采用NIO FileChannel 循环 读取,耗时:2502
时间: 2024-10-25 13:51:34

nio和io拷贝文件性能对比的相关文章

java 的nio与io对比

转:本文并非Java.io或Java.nio的使用手册,也不是如何使用Java.io与Java.nio的技术文档.这里只是尝试比较这两个包,用最简单的方式突出它们的区别和各自的特性.Java.nio提出了新的流(stream)通讯概念并且加入了新的缓冲.文件流以及socket(套接字)特性. java.io 概览 这个包通过数据流和序列化机制来实现系统输入和输出.并且支持多种类型的数据流,包括简单的字节.原生数据类型.地区字符以及对象.流是一个数据的序列:一个程序使用输入流从一个源头读取数据:

Java--Stream,NIO ByteBuffer,NIO MappedByteBuffer性能对比

目前Java中最IO有多种文件读取的方法,本文章对比Stream,NIO ByteBuffer,NIO MappedByteBuffer的性能,让我们知道到底怎么能写出性能高的文件读取代码. package com.seeyon.nio; import org.junit.Test; import java.io.*; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.Fi

java io读取性能对比

背景 从最早bio的只支持阻塞的bio(同步阻塞) 到默认阻塞支持非阻塞nio(同步非阻塞+同步阻塞)(此时加入mmap类) 再到aio(异步非阻塞) 虽然这些api改变了调用模式,但真正执行效率上是否也会有所不同,对此进行了此次java io的性能测试 首先从github上找到了2个项目,然后自己也实现了一个性能对比的实现,以便熟悉各种api 项目1: https://github.com/stateIs0/io.benchmark https://www.jianshu.com/u/4342

Java中的NIO和IO的对比分析

总的来说,java中的IO和NIO主要有三点区别: IO                  NIO 面向流     面向缓冲 阻塞IO  非阻塞IO  无   选择器(Selectors) 1.面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方.此外,它不能前后移动流中的数据.如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区. Java

转载:内存拷贝MEMCPY()与VMSPLICE()性能对比

内存拷贝MEMCPY()与VMSPLICE()性能对比 综述 在上一篇文章<进程间大数据拷贝方法调研>中介绍和对比了三种A进程读取文件然后拷贝给B进程的方法,测试结果显示在涉及到内存与磁盘间的数据传输时,splice方法由于避免了内核缓冲区与用户缓冲区之间的多次数据拷贝,表现最好.但是由于这种对比限定在包含I/O读写,且进程不能对数据进行修改的特殊情景中,毕竟在实际情况下不太常见,理论意义大于实际意义. 那本文要探讨的情景,在实际编程过程中就十分常见了: A进程的内存中有一大块数据,要传递给B

Tomcat 8(十)HTTP/AJP Connector、Bio/Nio/Apr性能对比

Tomcat 8(七)解读Bootstrap介绍过,Connector初始化/启动的时候,将初始化/启动内部的ProtocolHandler.其实ProtocolHandler只是个接口 ProtocolHandler的UML图(以下这些类在org.apache.coyote包下) 创建Connector对象时,Connector的构造函数内会根据server.xml的Connector标签的配置创建ProtocolHandler(默为Http11NioProtocol) public Conn

Go_18: Golang 中三种读取文件发放性能对比

Golang 中读取文件大概有三种方法,分别为: 1. 通过原生态 io 包中的 read 方法进行读取 2. 通过 io/ioutil 包提供的 read 方法进行读取 3. 通过 bufio 包提供的 read 方法进行读取 下面通过代码来验证这三种方式的读取性能,并总结出我们平时应该使用的方案,以便我们可以写出最优代码: package main import ( "os" "io" "bufio" "io/ioutil"

java中用IO流,拷贝文件夹中的文件

package 拷贝文件; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream

Golang 中三种读取文件发放性能对比

Golang 中读取文件大概有三种方法,分别为: 1. 通过原生态 io 包中的 read 方法进行读取 2. 通过 io/ioutil 包提供的 read 方法进行读取 3. 通过 bufio 包提供的 read 方法进行读取 下面通过代码来验证这三种方式的读取性能,并总结出我们平时应该使用的方案,以便我们可以写出最优代码: package main import ( "os" "io" "bufio" "io/ioutil"