文件复制的四种方式
以图片文件为例:
-
FileInputStream
与FileOutputStream
组合,读取图片文件到输入流中,输入流遍历,循环写入输出流信息,输出流指向文件并生成文件 -
FileInputStream
与FileOutputStream
组合之后,再通过BufferedInputStream
与BufferedOutputStream
包装,然后再进行读取写入操作。
使用InputStream
和OutputStream
复制文件的步骤为:- 创建一个字节输入流对象,构造方法中绑定要读取的数据源
- 创建一个字节输出流对象,构造方法中绑定要写入的目的地
- 使用字节输入流对象中的方法read读取文件
- 使用字节输出流中的方法write,把读取到的字节写入到目的地的文件中
- 释放资源
-
使用工具类,例如:
hutool
工具FileUtil.copyFilesFromDir();
底层使用的是java.nio.file.Files.copy()
-
使用
NIO
复制,FileChannel.transferFrom
方法
import cn.hutool.core.io.FileUtil;
import java.io.*;
import java.nio.channels.FileChannel;
public class CopyFile {
public static void main(String[] args) {
File fileCopyFileStream = new File("E:\\document\\io\\深入Nginx100讲脑图_copyFileStream.jpg");
File fileCopyBufferedFileStream = new File("E:\\document\\io\\深入Nginx100讲脑图_copyBufferedFileStream.jpg");
File fileCopyHutool = new File("E:\\document\\io\\深入Nginx100讲脑图_hutool.jpg");
File fileCopyNio = new File("E:\\document\\io\\深入Nginx100讲脑图_nio.jpg");
if (fileCopyFileStream.exists()) {
try {
fileCopyFileStream.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
File file = new File("E:\\document\\io\\深入Nginx100讲脑图.jpg");
long start1 = System.currentTimeMillis();
fileCopyFileStream(file,fileCopyFileStream);
long hTime = System.currentTimeMillis() - start1;
System.out.println("不使用Buffered所花时间:"+hTime);
long start3 = System.currentTimeMillis();
fileCopyBufferedFileStream(file,fileCopyBufferedFileStream);
long hbTime = System.currentTimeMillis() - start3;
System.out.println("使用Buffered所花时间:"+hbTime);
long start5 = System.currentTimeMillis();
FileUtil.copyFilesFromDir(file, fileCopyHutool, true);
long huTime = System.currentTimeMillis() - start5;
System.out.println("使用hutool工具所花时间:"+huTime);// 底层使用java.nio.file.Files.copy()方法
long start7 = System.currentTimeMillis();
copyByNio(file,fileCopyNio);
long nioTime = System.currentTimeMillis() - start7;
System.out.println("使用NIO所花时间:"+nioTime);
}
public static void fileCopyFileStream(File file,File fileCopyFileStream) {
try (
FileInputStream inputStream = new FileInputStream(file);
FileOutputStream outputStream = new FileOutputStream(fileCopyFileStream)
) {
byte[] arr = new byte[1024];
int len ;
while ((len = inputStream.read(arr)) != -1) {
outputStream.write(arr, 0, len);
}
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void fileCopyBufferedFileStream(File file,File fileCopyFileStream) {
try (
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream(fileCopyFileStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fos)
) {
byte[] arr = new byte[1024];
int len ;
while ((len = bufferedInputStream.read(arr)) != -1) {
bufferedOutputStream.write(arr, 0, len);
}
bufferedOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void copyByNio(File file,File fileCopyNio) {
try(
FileInputStream fileInputStream = new FileInputStream(file);
FileOutputStream fileOutputStream = new FileOutputStream(fileCopyNio);
) {
FileChannel input = fileInputStream.getChannel();
FileChannel output = fileOutputStream.getChannel();
output.transferFrom(input, 0, input.size());
} catch (IOException e) {
e.printStackTrace();
}
}
}
打印结果:
不使用Buffered所花时间:57
使用Buffered所花时间:20
使用hutool工具所花时间:77
使用NIO所花时间:8
复制结果:
将上面的图片文件[深入Nginx100讲脑图.jpg]改成视频文件[微信操作服务器上的应用程序.avi]后
执行结果:
不使用Buffered所花时间:3029
使用Buffered所花时间:667
使用hutool工具所花时间:276
使用NIO所花时间:234
复制结果:
总结:日常工作中推荐使用hutool工具类或者NIO操作文件,文本文件推荐使用带缓存输入输出流操作文件。