用java实现 两个工具和一个copy功能

版权声明:Firewine 的博客,想要转载请标明出处 https://blog.csdn.net/xyjworkgame/article/details/86540226

用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());
            }
        }
    }
}

后记

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

猜你喜欢

转载自blog.csdn.net/xyjworkgame/article/details/86540226