java使用工具类流复制,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对象。

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

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值