zoukankan      html  css  js  c++  java
  • Java实现复制文件或者文件夹

     拷贝一个文件的算法比较简单,当然,可以对它进行优化,比如使用缓冲流,提高读写数据的效率等。

     话不多说直接上代码

    import java.io.*;
    
    /**
     * 实现文件的拷贝
     */
    public class CopyFile {
    
        /**
         * 复制文件夹
         *
         * @param resource 源路径
         * @param target   目标路径
         */
        public static void copyFolder(String resource, String target) throws Exception {
    
            File resourceFile = new File(resource);
            if (!resourceFile.exists()) {
                throw new Exception("源目标路径:[" + resource + "] 不存在...");
            }
            File targetFile = new File(target);
            if (!targetFile.exists()) {
                throw new Exception("存放的目标路径:[" + target + "] 不存在...");
            }
    
            // 获取源文件夹下的文件夹或文件
            File[] resourceFiles = resourceFile.listFiles();
    
            for (File file : resourceFiles) {
    
                File file1 = new File(targetFile.getAbsolutePath() + File.separator + resourceFile.getName());
                // 复制文件
                if (file.isFile()) {
                    System.out.println("文件" + file.getName());
                    // 在 目标文件夹(B) 中 新建 源文件夹(A),然后将文件复制到 A 中
                    // 这样 在 B 中 就存在 A
                    if (!file1.exists()) {
                        file1.mkdirs();
                    }
                    File targetFile1 = new File(file1.getAbsolutePath() + File.separator + file.getName());
                    copyFile(file, targetFile1);
                }
                // 复制文件夹
                if (file.isDirectory()) {// 复制源文件夹
                    String dir1 = file.getAbsolutePath();
                    // 目的文件夹
                    String dir2 = file1.getAbsolutePath();
                    copyFolder(dir1, dir2);
                }
            }
    
        }
    
        /**
         * 复制文件
         *
         * @param resource
         * @param target
         */
        public static void copyFile(File resource, File target) throws Exception {
            // 输入流 --> 从一个目标读取数据
            // 输出流 --> 向一个目标写入数据
    
            long start = System.currentTimeMillis();
    
            // 文件输入流并进行缓冲
            FileInputStream inputStream = new FileInputStream(resource);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
    
            // 文件输出流并进行缓冲
            FileOutputStream outputStream = new FileOutputStream(target);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
    
            // 缓冲数组
            // 大文件 可将 1024 * 2 改大一些,但是 并不是越大就越快
            byte[] bytes = new byte[1024 * 2];
            int len = 0;
            while ((len = inputStream.read(bytes)) != -1) {
                bufferedOutputStream.write(bytes, 0, len);
            }
            // 刷新输出缓冲流
            bufferedOutputStream.flush();
            //关闭流
            bufferedInputStream.close();
            bufferedOutputStream.close();
            inputStream.close();
            outputStream.close();
    
            long end = System.currentTimeMillis();
    
            System.out.println("耗时:" + (end - start) / 1000 + " s");
    
        }
    
    
        // 使用示例
        public static void main(String[] args) {
    
            String rootPath = LoggerUtil.getJarRootPath();
            // rootPath = "E:MyProjectstudent	argetclasses";
    
            System.out.println("--------------------------------复制文件-------------------------------------------");
    
            File f1 = new File("D:\GHO\Windows10企业版.iso");
            // 目标文件
            File f2 = new File("F:\logs\" + "win10.iso");
    
            try {
                // 这个 win10系统 大概是 3.50G 的 复制过程 花了 156 秒 == 2 分6 秒
                copyFile(f1, f2);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            System.out.println("--------------------------------复制文件夹-------------------------------------------");
    
            String resource = rootPath + "logs" + File.separator + "job1234";
            String target = rootPath + "logs" + File.separator + "job123";
            try {
                copyFolder(resource, target);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
    }
  • 相关阅读:
    noip2017逛公园
    [noip模拟赛]小U的女装
    AT2364 Colorful Balls
    关于bitset
    [ZJOI2010]排列计数
    [noip模拟赛]午餐
    [noip2017]列队
    [学习笔记]dsu on a tree(如何远离线段树合并)
    luogu4917天守阁的地板
    线性求素数+莫比乌斯函数+欧拉函数模板
  • 原文地址:https://www.cnblogs.com/oukele/p/11003307.html
Copyright © 2011-2022 走看看