zoukankan      html  css  js  c++  java
  • 用java实现 两个工具和一个copy功能

    用java 实现三个工具类

    1. 输入路径,该工具会将该路径下的所有文件列出来

    这个是使用NIO的path和files 来进行的,非常的方便

    class T1 {
    
        public void ergioc(String path) throws IOException {
            Files.walkFileTree(Paths.get(path), new SimpleFileVisitor<Path>() {
    
    
                //访问目录
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                    System.out.println("正在访问 " + dir + "目录");
    
    
                    return FileVisitResult.CONTINUE;
                }
    
                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                    return super.visitFileFailed(file, exc);
                }
    
                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                    //当访问到目录之后,出发的方法
                    return super.postVisitDirectory(dir, exc);
                }
    
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    
                    System.out.println("正在访问的文件 : " + file + "文件");
    
                    return FileVisitResult.CONTINUE;
                }
            });
    
        }
    }
    

    2. 输入路径,该工具会将该路径下的文件、文件夹的数量统计出来

    ** 通过简单的遍历和递归实现的一个小功能,**

    class T2 {
    
        int dirCount = 0;
        int fileCount = 0;
    
        public void Count1(String path) {
            File file = new File(path);
            File[] listFile = file.listFiles();
    
            for (int i = 0; i < listFile.length; i++) {
    
                if (listFile[i].isDirectory()) {
                    dirCount++;
                    Count1(listFile[i].toString());
                } else if (listFile[i].isFile()) {
                    fileCount++;
    
                } else {
                    Count1(listFile[i].toString());
                }
            }
        }
    
        public void sc() {
            System.out.println("文件数 :" + fileCount);
            System.out.println("目录数 : " + dirCount);
        }
    
    }
    

    3. 实现copy 功能(有点简陋,,细节没有处理)

    ** 这个没用NIO2 ,如果有时间的话,我可以尝试下**

    class T3 {
    
    
        //写一个总的方法来引用这个方法,,然后进行
        public void  toatal(String path , String path1){
    
            File file1 = new File(path);
            File file2 = new File(path1);
    
            if (!file2.exists()){
                System.out.println("暂时没有写 合并,,该文件或文件夹已经存在");
            }else {
                CountCatalog(path,path1);
                copyFile(path,path1);
            }
    
        }
        /**
         * 如何通过java实现一个cpoy 功能 ; 如果是目录则递归进行复制,如果是文件,则直接复制
         * 1. 首先 得到想要复制的文件或文件目录,
         * 2. 如果是文件目录得到目录里面是否有 目录或者是文件
         *
         * 首先输入的路径是 第一个是被复制的文件或者文件夹  第二是 目的路径地址
         *
         */
        public void copyFile(String path, String path1) {
            File file = new File(path);
            File file1 = new File(path1);
            File[] listFile = file.listFiles();
    
    
            //如果不行,就用三个方法来合成起来
            for (int i = 0; i < listFile.length; i++) {
    
                if (listFile[i].isDirectory()) {
    
                    copyFile(listFile[i].toString(), file1.getPath().toString());
                } else if (listFile[i].isFile()) {
    
    
                    String la = listFile[i].toString().substring(11,listFile[i].toString().length());
                    String tmp = file1.toString() + la;
    
                    File tmp1 = new File(tmp);
                    try {
                        if(tmp1.createNewFile()){
    
                            FileInputStream fileInputStream = new FileInputStream(listFile[i].toString());
                            FileOutputStream fileOutputStream = new FileOutputStream(tmp);
    
                            int hasRead = 0;
                            byte[] bbuf = new byte[1024];
                            while ((hasRead = fileInputStream.read(bbuf)) > 0){
                                fileOutputStream.write(bbuf);
                            }
                            System.out.println(tmp +"      创建成功");
                            fileInputStream.close();
                            fileOutputStream.close();
                        }else {
                            System.out.println("文件已经存在");
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }finally {
    
                    }
    
                    // 将父目录代替
                    String mulu1 = listFile[i].toString().replace(la, file1.toString());
    
    
    
                } else {
                    copyFile(listFile[i].toString(), file1.getPath().toString());
                }
            }
        }
        /**
         * 我觉得应该使用递归 是更加的方便的,
         * 1. 首先, 你复制的文件或者目录是不一样的,如果是文件 那么 路径就是代表的文件
         * 2. 如果是目录, 但是你复制的目录的父目录 然后的子目录,所以你先要创建父目录
         * 3. 或者不是使用递归,而是使用树图或者说是回溯法,是不更加的方便 ???????????????
         *
         * @param path
         */
        public void CountCatalog(String path, String path1) {
            File file = new File(path);
            File file1 = new File(path1);
            File[] listFile = file.listFiles();
    
            // 首先是不该判断是否是这个 目录是否在这个地方是否存在,如果存在,现在现在先不写合并
            // 如果没有 首先你要创建父目录
            // 然后通过递归得到下面的目录和文件
            // 但是 目录会自动根据文件的绝对路径进行创建的,所以的,使用mkdirs 可以直接并且非常的方便
            /**
             * 现在的难点就是 : 前面获取的路径 可是并不能使用啊
             *
             * 我可以 通过字符串的形式, 去确定修改绝对路径不就行了吗
             */
    
    
            for (int i = 0; i < listFile.length; i++) {
    
                if (listFile[i].isDirectory()) {
    
                    // 父目录
                    //父目录不可变所以提到for语句上面
                    String la = listFile[i].getParent();
    
                    // 将父目录代替
                    String mulu1 = listFile[i].toString().replace(la, file1.toString());
                    File tmp = new File(mulu1);
    
                    // 创建目录
                    if (tmp.mkdirs()) {
                        System.out.println(mulu1 + "      创建成功");
                    } {
                        System.out.println("文件夹已经存在");
                    }
                    //第二个参数,,只是在每个递归中保存这个路径
                    CountCatalog(listFile[i].toString(), mulu1);
    
                }else if (listFile[i].isFile()){
    
                } else {
                    CountCatalog(listFile[i].toString(), file1.getPath().toString());
                }
            }
        }
    }
    

    后记

    如果你有更好的方法,可以与我分享,

  • 相关阅读:
    自编码器AutoEncoder,降噪自编码器DAE,稀疏自编码器SAE,变分自编码器VAE 简介
    经验模式分解EMD与集合经验模态分解EEMD
    Adversarial Faces
    网络权重初始化方法 常数初始化、Lecun、Xavier与He Kaiming
    信息熵、交叉熵、KL散度、JS散度、Wasserstein距离
    神经网络前向传播和反向传播公式 详细推导
    Softmax 原理及 Sigmoid和Softmax用于分类的区别
    However, but, yet, while, whereas 表转折的区别; while, whereas区别
    阿里云mysql数据库恢复到本地
    js 14位字符串 转日期
  • 原文地址:https://www.cnblogs.com/YJBlog/p/10440703.html
Copyright © 2011-2022 走看看