King's Studio

手写字节流文件拷贝类

字数统计: 829阅读时长: 3 min
2019/01/27 Share

今天手写了利用字节流拷贝文件的方法类,调用该方法可传入源文件、目的文件绝对路径,也可传入源文件、目的文件对象;后更新了文件夹拷贝方法,有一些不同,如果源对象是文件就直接调用文件拷贝方法,注意不能创建与文件夹同名的文件。

CopyFileUtil类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public class CopyFileUtil {

//参数是路径
public static void copyDir(String srcPath,String destPath) throws FileNotFoundException, IOException {
//创建源文件夹对象
File src = new File(srcPath);
//创建目的文件夹对象
File dest = new File(destPath);
copyDir(src, dest);
}

//参数是文件对象
public static void copyDir(File src,File dest) throws FileNotFoundException, IOException {
if (src.isDirectory()) {//如果源目录是文件夹
dest = new File(dest,src.getName());//就在目的目录的基础上创建该源目录的文件夹
}
copyDirectory(src, dest);
}

//拷贝文件夹具体操作
public static void copyDirectory(File src,File dest) throws FileNotFoundException,IOException{
if (src.isFile()) {//是文件就调用文件拷贝方法
try {
//直接调用写好的文件拷贝方法
CopyFileUtil.copyFile(src, dest);
} catch (FileNotFoundException e) {
//e.printStackTrace();
} catch (IOException e) {
//e.printStackTrace();
}
}else if (src.isDirectory()) {//如果是文件夹
//先创建文件夹,确保目的文件夹存在
dest.mkdirs();
//遍历,获取子孙目录
for(File sub:src.listFiles()) {
//调用拷贝文件夹方法自己
copyDirectory(sub, new File(dest,sub.getName()));
}
}
}


//一、该方法需要提供源文件和目的文件路径
public static void copyFile(String srcPath,String destPaht) throws IOException,FileNotFoundException {
//建立联系
copyFile(new File(srcPath), new File(destPaht));
}

//二、对copyFile()方法进行重载,需要提供源文件和目的文件对象
public static void copyFile(File src,File dest) throws IOException,FileNotFoundException {
//逻辑判断,如果是文件夹则抛出该异常
if (!src.isFile()) {
System.out.println("只能拷贝文件");
throw new IOException("只能拷贝文件");//若是文件夹抛出该异常
}

//如果dest为已经存在的文件夹,不能建立与文件夹同名的文件
if (dest.isDirectory()) {
System.out.println("不能建立与文件夹同名的文件");
throw new IOException("不能建立与文件夹同名的文件");
}

//2、选择流
//建议加上字节缓冲流,提高性能,在文件输入输出流外层包裹
InputStream is = new BufferedInputStream(new FileInputStream(src));//多态
OutputStream os = new BufferedOutputStream(new FileOutputStream(dest));

//3、文件拷贝
byte[] flush = new byte[1024];//接收数组
int len = 0;
while(-1!=(len= (is.read(flush)))) {
//将读入的数组写出
os.write(flush);
}
//强制刷新
os.flush();
//先创建的后释放,后创建的先释放
os.close();
is.close();
}
}

文件拷贝测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CopyFileTest extends CopyFileUtil{//继承自己写的CopyFileUtil工具类,就拥有了copyFile()方法

public static void main(String[] args) {
//源文件地址
String src = "/Users/jinqi/Desktop/b.txt";
//目的文件地址
String dest = "/Users/jinqi/Desktop/c.txt";
try {
//调用拷贝文件方法,将文件源地址和目的地址传进去
copyFile(src, dest);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件不存在");
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件拷贝失败||关闭资源失败");
}
}
}

文件夹拷贝测试

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
//源目录
String srcPath = "/Users/jinqi/Desktop/test";
//目的目录
String destPath = "/Users/jinqi/Desktop/test2";
try {
CopyFileUtil.copyDir(srcPath, destPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

原文作者:金奇

原文链接:https://www.rossontheway.com/2019/01/27/java回顾5/

发表日期:January 27th 2019, 12:00:00 am

更新日期:March 21st 2019, 9:34:38 am

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,除特别声明外,转载请注明出处!

CATALOG
  1. 1. CopyFileUtil类
  2. 2. 文件拷贝测试
  3. 3. 文件夹拷贝测试