Java的简单线程复制文件工具类FileUtil2.0

FileUtil2.0相对于版本1.0,多了很多方法,比如,获取文件的后缀名,或修改后缀名和一些文件的简单操作。

文件复制到文件,文件复制到路径,路径下文件复制到新路径下,代码如下,请享用:

package cn.util;

import java.io.*;

/**
 * 线程的方式实现文件的复制。
 文件的复制需要四个参数:1,路径或文件),2路径或文件,3,是否覆盖,4,是否追加,
多文件复制还需要加时间参数(毫秒).
 * 以及File类实例的简单创建,
 *
 * @version 2
 * @author JXLYS
 */
public class FileUtil extends Thread {

    static class FileUtilHelp {//辅助类

        private static FileUtil[] farr = new FileUtil[5];// 线程数量(java默认线程最多10)

        // 创建文件并复制
        private static void createFileAndCopy(File f1, File f2, boolean override, boolean append) {
            if (!f2.exists()) {
                createFile(f2, override);
            } else {
                if (!override)
                    return;
                else {
                    append = false;// 覆盖必然不会追加
                }
            }
            FileUtilHelp.createThread(f1, f2, append);
        }

        private static void createCopy(InputStream is, OutputStream os) {
            int i = 0;
            for (FileUtil f : farr) {
                if (f == null || !f.isAlive()) {
                    farr[i] = new FileUtil();
                    farr[i].setInputStreamAndOutputStream(is, os);
                    farr[i].start();
                }
                i++;
            }
        }

        // 创建路径
        private static void createMkdirs(String path) {
            File f = new File(path);
            if (!f.exists()) {
                f.mkdirs();
            }
        }

        // 开始线程
        private static void createThread(File f1, File f2, boolean append) {
            int i = 0;
            for (FileUtil f : farr) {
                if (f == null || !f.isAlive()) {
                    farr[i] = new FileUtil();
                    farr[i].copyThread(f1, f2, append);
                    farr[i].start();
                }
                i++;
            }
        }

    }

    /**
    * 复制文件1到文件2(可以创建路径)
    *
    * @param f1
    *            文件对象
    * @param f2
    *            文件对象
    * @param override
    *            是否覆盖
    * @param append
    *            是否追加文件内容
    */
    public static void copyFile(File f1, File f2, boolean override, boolean append) {
        if (exists(f1)) {
            FileUtilHelp.createMkdirs(parent(f2));
            FileUtilHelp.createFileAndCopy(f1, f2, override, append);
        }
    }

    /**
    * 复制文件1到文件2(可以创建路径)
    *
    * @param fileName
    *            文件1
    * @param fileName2
    *            文件2
    * @param override
    *            是否覆盖
    */
    public static void copyFile(String fileName, String fileName2, boolean override, boolean append) {
        copyFile(newFile(fileName), newFile(fileName), override, append);
    }

    /**
    * 复制文件到指定路径(可创建路径)
    *
    * @param f1
    *            文件
    * @param f2
    *            文件夹
    * @param override
    *            是否覆盖
    * @param append
    *            是否追加
    * @return
    */
    public static void copyFileToPath(File f1, File f2, boolean override, boolean append) {
        copyFile(f1, newFile(f2.getAbsolutePath(), f1.getName()), override, append);
    }

    /**
    * 根据流来复制。
    *
    * @param is
    *            输入流
    * @param os
    *            输出流
    */
    public static void copyFile(InputStream is, OutputStream os) {
        FileUtilHelp.createCopy(is, os);
    }

    /**
    * 复制文件到指定路径(可创建路径)
    *
    * @param fileName
    *            文件名
    * @param path
    *            路径
    * @param override
    *            覆盖
    * @param append
    *            是否追加
    */
    public static void copyFileToPath(String fileName, String path, boolean override, boolean append) {
        copyFileToPath(newFile(fileName), newFile(path), override, append);
    }

    /**
    * 复制指定路径下所有文件到指定路径(建议大文件不要太多)
    *
    * @param f1
    *            文件对象
    * @param f2
    *            文件对象
    * @param override
    *            是否覆盖
    * @param append
    *            是否追加
    * @param time
    *            复制每个文件的间隔
    */
    public static void copyPathToPath(File f1, File f2, boolean override, boolean append, long time) {
        if (exists(f1) && isDirectory(f1)) {
            File[] farr = f1.listFiles();
            for (File f : farr) {
                try {
                    Thread.sleep(time);// 一次性复制超过5个,线程支持不住,慢点也不影响性能。
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                copyFileToPath(f, f2, override, append);
            }
        }
    }

    /**
    * 复制指定路径下所有文件到指定路径(大文件需要更多时间。)
    *
    * @param path1
    *            路径
    * @param path2
    *            路径
    * @param override
    *            是否覆盖
    * @param append
    *            是否追加
    * @param time
    *            复制每个文件的间隔
    */
    public static void copyPathToPath(String path1, String path2, boolean override, boolean append, long time) {
        copyPathToPath(newFile(path1), newFile(parent(newFile(path1)), path2), override, append, time);
    }

    /**
    * 创建目录
    *
    * @param f
    */
    public static void createDire(File f) {
        FileUtilHelp.createMkdirs(f.getAbsolutePath());
    }

    /**
    * 根据路径创建目录
    *
    * @param path
    */
    public static void createDire(String path) {
        createDire(newFile(path));
    }

    /**
    * 不覆盖的创建文件
    *
    * @param f
    */
    public static void createFile(File f) {
        createFile(f, false);
    }

    /**
    * 创建文件
    *
    * @param f
    *            文件对象
    * @param override
    *            是否覆盖
    */
    public static void createFile(File f, boolean override) {
        FileUtilHelp.createMkdirs(parent(f));
        if (override) {
            f.delete();
        }
        if (!exists(f)) {
            try {
                f.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
    * 不覆盖的创建文件
    *
    * @param f
    */
    public static void createFile(String fileName) {
        createFile(fileName, false);
    }

    /**
    * 创建文件
    *
    * @param fileName
    *            创建文件
    * @param override
    *            是否覆盖
    */
    public static void createFile(String fileName, boolean override) {
        createFile(newFile(fileName), override);
    }

    /**
    * 检测文件对象是否存在
    *
    * @param f
    */
    public static boolean exists(File f) {
        return f.exists() ? true : false;
    }

    /**
    * 检测路径是否存在
    *
    * @param f
    */
    public static boolean exists(String fileName) {
        return exists(new File(fileName));
    }

    /**
    * 检测文件对象是否目录
    *
    * @param f
    */
    public static boolean isDirectory(File f) {
        return f.isDirectory();
    }

    /**
    * 检测路径是否目录
    *
    * @param f
    */
    public static boolean isDirectory(String fileName) {
        return isDirectory(newFile(fileName));
    }

    /**
    * 检测文件对象是否文件
    *
    * @param f
    */
    public static boolean isFile(File f) {
        return f.isFile();
    }

    /**
    * 获取文件的后缀名
    *
    * @param fileName
    * @return
    */
    public static String suffixName(String fileName) {
        return suffixName(newFile(fileName));
    }

    /**
    * 获取不带后缀名的文件名字符串
    *
    * @param fileName
    * @return
    */
    public static String getNoSuffixName(String fileName) {
        return getNoSuffixName(newFile(fileName));
    }

    /**
    * 获取不带后缀名的文件名字符串
    *
    * @param f
    * @return
    */
    public static String getNoSuffixName(File f) {
        return f.getName().substring(0, f.getName().lastIndexOf("."));
    }

    /**
    * 重命名
    *
    * @param fileName1
    *            路径
    * @param fileName2
    *            路径
    */
    public static void rename(String fileName1, String fileName2) {
        rename(newFile(fileName1), newFile(fileName2));
    }

    /**
    * 重命名
    *
    * @param f1
    * @param f2
    */
    public static void rename(File f1, File f2) {
        f1.renameTo(f2);
    }

    /**
    * 修改指定路径的文件后缀名。
    *
    * @param fileName
    *            路径
    * @param suffix
    *            后缀名
    */
    public static void replaceSuffixName(String fileName, String suffix) {
        replaceSuffixName(newFile(fileName), suffix);
    }

    /**
    * 修改文件后缀名
    *
    * @param file
    *            对象,
    * @param suffix
    *            后缀
    */
    public static void replaceSuffixName(File file, String suffix) {
        StringBuilder name = new StringBuilder();
        name.append(getNoSuffixName(file));
        name.append(".");
        name.append(suffix);
        rename(file, newFile(parent(file), name.toString()));
    }

    /**
    * 获取文件的后缀名
    *
    * @param f
    * @return
    */
    public static String suffixName(File f) {
        String[] sarr = f.getName().split("\\.");
        return sarr.length > 1 ? sarr[sarr.length - 1] : null;
    }

    /**
    * 检测路径是否文件
    *
    * @param f
    */
    public static boolean isFile(String fileName) {
        return isFile(newFile(fileName));
    }

    /**
    * 根据路径创建文件对象,
    *
    * @param fileName
    * @return
    */
    public static File newFile(String fileName) {
        return new File(fileName);
    }

    /**
    * 创建路径和文件名创建文件对象
    *
    * @param path
    *            路径
    * @param fileName
    *            文件名字
    * @return
    */
    public static File newFile(String path, String fileName) {
        return new File(path, fileName);
    }

    /**
    * 返回对象的父目录
    *
    * @param f
    * @return
    */
    public static String parent(File f) {
        String str = f.getName();
        String abso = f.getAbsolutePath();
        return abso.substring(0, abso.length() - str.length());
    }

    /**
    * 根据文件和样式获取文件大小的字符串
    *
    * @param file
    *            根据文件路径
    * @param size
    *            文件大小样式(KB或MB或GB)
    * @return
    */
    public static String size(File file, String size) {
        long len = file.length();
        double d = 0;
        StringBuilder sb = new StringBuilder();
        switch (size) {
        case "k":
        case "K":
        case "kb":
        case "Kb":
        case "KB":
        case "kB":
            d = 1.0 * len / 1024;
            sb.append(String.format("%.3f", d));
            sb.append("MB");
            break;
        case "m":
        case "M":
        case "mb":
        case "MB":
        case "mB":
        case "Mb":
            d = 1.0 * len / 1024 / 1024;
            sb.append(String.format("%.3f", d));
            sb.append("MB");
            break;
        case "g":
        case "G":
        case "gb":
        case "GB":
        case "Gb":
        case "gB":
            d = 1.0 * len / 1024 / 1024 / 1024;
            sb.append(String.format("%.3f", d));
            sb.append("GB");
            break;
        default:
            sb.append(len);
            sb.append("B");
        }
        return sb.toString();
    }

    /**
    * 根据路径和样式获取文件大小的字符串
    *
    * @param fileName
    *            根据文件路径
    * @param size
    *            文件大小样式(KB或MB或GB)
    * @return
    */
    public static String size(String fileName, String size) {
        return size(newFile(fileName), size);
    }

    private InputStream is;
    private OutputStream os;

    private FileUtil() {
    }

    private void setInputStreamAndOutputStream(InputStream is, OutputStream os) {
        this.is = is;
        this.os = os;
    }

    private void copyThread(File f1, File f2, boolean append) {
        try {
            is = new FileInputStream(f1);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        try {
            os = new FileOutputStream(f2, append);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public void run() {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            bis = new BufferedInputStream(is);
            bos = new BufferedOutputStream(os);
            byte[] barr = new byte[1024];
            int len = 0;
            while ((len = bis.read(barr)) != -1) {
                bos.write(barr, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bis != null)
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            if (bos != null)
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
}

组合并且封装了File的一些方法,文件路径就是File对象。

上边都是字符流,至于线程开启字符流的的运算,加油,你可以的。

猜你喜欢

转载自www.linuxidc.com/Linux/2017-12/149787.htm
今日推荐