Java实现文件复制详解编程语言
2023-06-13 09:20:41 时间
Java复制文件 下面介绍两种方法
一种是使用传统的缓冲输入输出流(InputStream、OutputStream)来实现
另外一种使用文件通道(FileChannel)来实现,效率上FileChannel会比InputStream快
而且文件越大对比越明显
一、缓冲输入输出流(InputStream、OutputStream)/** * 缓冲输入输出流方式复制文件 * @param srcFileName 待复制的文件名 * @param descFileName 目标文件名 * @param overlay 如果目标文件存在,是否覆盖 * @return 如果复制成功返回true,否则返回false public static boolean copyFile(String srcFileName, String destFileName,boolean overlay) { File srcFile = new File(srcFileName); // 判断源文件是否存在 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); if (destFile.exists()) { // 如果目标文件存在并允许覆盖 if (overlay) { // 删除已经存在的目标文件 new File(destFileName).delete(); } else { // 如果目标文件所在目录不存在,则创建目录 if (!destFile.getParentFile().exists()) { // 目标文件所在目录不存在 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]; 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(); }二、文件通道(FileChannel)
/** * 使用文件通道的方式复制文件 * @param srcDirName 待复制的文件名 * @param destDirName 目标文件名 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(); // 得到对应的文件通道 in.transferTo(0, in.size(), out); // 连接两个通道,并且从in通道读取,然后写入out通道 } catch (IOException e) { e.printStackTrace(); } finally { try { fi.close(); in.close(); fo.close(); out.close(); } catch (IOException e) { e.printStackTrace(); }
测试代码
public static void main(String[] args) { String srcDirName = "D:/jdk-6u2-windows-i586-p.exe"; String destDirName = "D:/jdk-6u2-windows-i586-p-bak.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"); }
输出结果
所测试文件大小为65M,由此可见FileChannel复制文件的速度比FileInputStream快很多。
而且FileChannel是多并发线程安全的。
作者:blog.ytso.com
14293.html
cjavawindows相关文章
- JAVA代码实现FTP文件下载
- java vo 什么意思_在Java中VO , PO , BO , QO, DAO ,POJO是什么意思
- Java文件上传实例并解决跨域问题
- java scanner怎么用_Java中Scanner类的用法及使用步骤分享!「建议收藏」
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- java redis锁_Java中Redis锁的实现[通俗易懂]
- js文件上传的几种方式_java执行js文件
- 使用maven打包jar_两个java文件打包成jar
- java在线生成uuid_Java生成uuid
- Java 读写文件大全详解编程语言
- Java多线程实现文件快速切分详解编程语言
- java JNI: C 语言调用 Java 方法示例详解编程语言
- java获得文件的最后修改时间详解编程语言
- Java 对文件进行 CRC32 校验详解编程语言
- Java学习笔记之五java数组详解编程语言
- Java 读取XML文件(DOM实现)详解编程语言
- Java 文件重命名详解编程语言
- Java ftp上传文件方法效率对比详解编程语言
- Java实现获取属性文件的参数值详解编程语言
- Java数据持久层框架 MyBatis之API学习六(Mapper XML 文件详解)编程语言
- java File读取本地文件,判断是否存在详解编程语言
- Java RandomAccessFile类:动态读取文件内容
- 异常Java程序捕获Oracle异常从失败中学习(java捕获oracle)
- java实现倒序读取文件功能示例分享