Java_IO_两种文件复制方式比较
来源:互联网 发布:mac战网改地区 编辑:程序博客网 时间:2024/04/26 03:27
一:缓冲输入输出流(InputStream、OutputStream)
<span style="font-size:14px;">/* *缓冲输入输出流方式复制文件 */public static boolean copyFile(String srcFileName,String destFileName,boolean overlay){File srcFile = new File(srcFileName); //根据一个路径得到File对象//判断源文件是否存在if(!srcFile.exists()){try{throw new Exception("源文件:"+srcFileName+"不存在!");}catch(Exception e){e.printStackTrace();//将异常内容存到日志文件中}return false;}else if(!srcFile.isFile()){//判断是不是一个文件try {throw new Exception("复制文件失败,源文件:"+srcFileName+"不是一个文件!");} catch (Exception e) {e.printStackTrace();}return false;}//判断目标文件是否存在File destFile = new File(destFileName);//目标文件对象destFileif(destFile.exists()){//如果目标文件存在并允许覆盖if(overlay){//删除已经存在的目标文件new File(destFileName).delete();}}else{//如果目标文件所在目录不存在,则创建 目录if(!destFile.getParentFile().exists()){//目标文件所在目录不存在//mkdirs():创建此抽象路径名指定的目录,包括所有必需但不存在的父目录if(!destFile.getParentFile().mkdirs()){//复制文件失败:创建目标文件所在目录失败return false;}}}//复制文件int byteread = 0;//读取的字节数InputStream in = null;OutputStream out = null;try {in = new FileInputStream(srcFile);out = new FileOutputStream(destFile);byte[] buffer = new byte[1024];/* * 方法说明: * ①:将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 * write(byte[] b, int off, int len) * b - 数据 * off - 数据中的起始偏移量。 * len - 要写入的字节数。 * ②:in.read(buffer))!=-1,是从流buffer中读取一个字节,当流结束的时候read返回-1 */while((byteread = in.read(buffer))!=-1){out.write(buffer, 0, byteread);}return true;} catch (FileNotFoundException e) {return false;} catch (IOException e) {return false;}finally{try {if(out!=null){out.close();}if(in!=null){in.close();}} catch (IOException e) {e.printStackTrace();}}}</span>
二:文件通道(FileChannel)
<span style="font-size:14px;">/* * 使用文件通道的方式复制文件 */public static void fileChannelCopy(String srcDirName,String destDirName){FileInputStream fi = null;FileOutputStream fo = null;FileChannel in = null;FileChannel out = null;try {fi = new FileInputStream(new File(srcDirName));fo = new FileOutputStream( new File(destDirName));in = fi.getChannel();//得到对应的文件通道out = fo.getChannel();//得到对应的文件通道/* * public abstract long transferTo(long position, long count, WritableByteChannel target)throws IOException; * position - 文件中的位置,从此位置开始传输;必须为非负数 * count - 要传输的最大字节数;必须为非负数 * target - 目标通道 *返回: 实际已传输的字节数,可能为零 */in.transferTo(0, in.size(), out);//连接两个通道,并且从in通道读取,然后写入out通道中} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {fi.close();in.close();fo.close();out.close();} catch (IOException e) {e.printStackTrace();}}}</span>测试上面的两个方法:
<span style="font-size:14px;">public class copyFile{public static void main(String[] args) {String srcDirName = "E:/360cse_official.exe";//待复制的文件名String destDirName ="E:/360cse_official_test.exe";//目标文件名long start;long end;start = System.currentTimeMillis();//返回系统的当前时间copyFile.copyFile(srcDirName,destDirName,true);end = System.currentTimeMillis();System.out.println("缓冲输入输出流方式复制文件,用时:"+(end-start)+"ms");start = System.currentTimeMillis();copyFile.fileChannelCopy(srcDirName,destDirName);end = System.currentTimeMillis();System.out.println("使用文件通道的方式复制文件,用时:"+(end-start)+"ms");}</span>
测试文件:
运行结果:
缓冲输入输出流方式复制文件,用时:499ms
使用文件通道的方式复制文件,用时:57ms
使用文件通道的方式复制文件,用时:57ms
总结:
通过对上面两个方法测试,我们可以知道使用文件通道的方式复制文件,明显比输出流复制文件效率要高。
学到的知识点:
①:返回系统的当前时间:start = System.currentTimeMillis();②:write(byte[] b, int off, int len) 方法
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
b - 数据off - 数据中的起始偏移量。len - 要写入的字节数。
③:in.read(buffer))!=-1,是从流buffer中读取一个字节,当流结束的时候read返回-1④:in.transferTo(0, in.size(), out);//连接两个通道,并且从in通道读取,然后写入out通道中
public abstract long transferTo(long position, long count,WritableByteChannel target)throws IOException;position - 文件中的位置,从此位置开始传输;必须为非负数count - 要传输的最大字节数;必须为非负数target - 目标通道返回:实际已传输的字节数,可能为零
1 0
- Java_IO_两种文件复制方式比较
- Java_IO_两种文件复制方式比较
- 两种方式复制一个mp3文件
- C#复制数组的两种方式,以及效率比较
- JAVA_IO_复制图片
- java 实现文件复制的两种方式
- Java中复制文件的两种方式
- java 实现文件复制的两种方式
- java复制单个文件的两种方式
- java 实现文件复制的两种方式
- Java实现文件复制的两种方式
- 4种复制文件的方式性能比较
- 两种方式复制表
- 两种拷贝文件方式的速度比较。
- php两种include加载文件方式效率比较
- springmvc 上传文件两种方式比较以及上传问题解决
- Java_IO_文件查看
- JAVA_IO_文件读取
- 关于cin、gets等输入的一些用法
- 使用json发生java.lang.NoClassDefFoundError: net/sf/json/JSONObject异常的解决办法
- 宿主机跟Vmware中的linux使用host-only,bridge方式通信
- ACM中的博弈论入门(七) NIM的证明
- 架构设计:系统间通信(40)——自己动手设计ESB(1)
- Java_IO_两种文件复制方式比较
- HDU-1233 还是畅通工程
- CTF万里追踪——上帝也哭泣
- 1119 机器人走方格 V2
- WCDMA系统中的差错控制方式
- Python的自我修炼之路(一)
- android环境搭建
- ATSHA204A加密芯片攻略——使用篇
- Light oj 1284 Lights inside 3D Grid