文件夹的复制 io的概念
什么是io流
字面意思就是Input和output。
java io是用来实现数据的传输与保存的操作,吧一部分数据转移到另一部分,里面各种各样的类只是为了方便处理各种数据。

- 图片的解释
1.左右是数据的源头和目的地,java中一般体现为File文件
2.当我们new了一个新的输入流并且传入了源头路径,相当于管道也源头连接,但是仍有水龙头阻塞数据
3.new一个新的输出流并设定了目标路径,相当于管道和目的地连接了起来,但是仍有水龙头阻塞数据
4.当我们使用输入流的read方式,数据就打开水龙头流入了给定的量进入管道
5.使用输出流的write方法,数据就打开水龙头流入了目的地。
6.4和5步骤循环就吧数据复制了过去(源文件仍存在)。
7.使用flush方法,相当于清空管道,保证数据全部转移。
8.使用close方法,分别关闭输出流,输入流。把管道关闭,资源还给服务器。
9.字节流,字符流,FIle流,都只是为了处理不同的数据而已。
![image]()
file的关系
可以看到,流和文件必须联合起来才能传输(管道和目的地)。
File的构造方法

//给出一个路径,创建一个该路径的文件夹对象
File file = new File("D:\\bapp\\test.xlsx");
//得到该层文件或目录的名称 test.xlsx
String fileName = file.getName();
//得到父级目录 D:/bapp
String parentFile = file.getParent();
//得到父级的文件或文件夹对象 D:/bapp
File parenFile = file.getParentFile();
//F:\Java项目\springBJPowerNode\D\zyy --相对路径
File file2 = new File("D","zyy");
//D:\zyy\a\b 带盘符,当作d盘
File file3 = new File("D:","/zyy/a/b/c/");
//判断是否为文件夹 false
boolean directory = file.isDirectory();
//判断是否为文件 true
boolean myFile = file.isFile();
if (!file3.exists()){
//mkdir只能创建一层目录,多层目录无法创建。D:\zyy
//mkdirs可以创建多层,D:\zyy\a\b
// 但是只能创建目录,不能创建文件
file3.mkdirs();
}
File file4 = new File("D:/zyy/a/b/c/hah.txt");
//该方法是为了创建文件,但是之前必须要存在想要创建文件的目录。
file4.createNewFile();
//file3必须是一个文件夹,不能是文件(文件就确定了,也没有下一级了)
//得到该路径下一级的所有文件或文件夹。
File[] files = file3.listFiles();
for(File f: files){
//只会得到该路径下一级的所有文件或文件夹
System.out.println(f);
}
//删除该文件夹
file3.delete();
文件夹的复制
- 思路
- 材料准备
- 源文件夹
- 想要复制的目的地文件夹
- 输入流
- 输出流
- 方法准备
- 递归文件夹,找到各个文件进行复制。
- 步骤
- 创建源文件对象,目标文件夹对象
- 创建输入输出流
- 通过递归找到各个源文件(创建一个文件夹的递归方法)
- 输入流读取源文件到流管道
- 输出流把数据写入目标文件夹
- 通过循环,读取所有文件
- 刷新,关闭输出流,关闭输入流
- 材料准备
实现方式1
public static void main(String args[]) throws IOException {
//复制的源文件夹
File srcFile = new File("D:/xxx/Downloads/Compressed");
// 复制的目标文件夹
File desFile = new File("E:/zyy/a");
//复制的方法
copyDir(srcFile,desFile);
}
private static void copyDir(File srcFile,File desFile) {
//如果当前file是文件,就返回
if(srcFile.isFile()){
//进行文件的复制
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//得到写的目标路径
String path = (desFile.getAbsolutePath().endsWith("\\")?desFile.getAbsolutePath():desFile.getAbsolutePath()+"\\")+srcFile.getAbsolutePath().substring(3);
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(path);
//byte数组用来承载数据
byte[] bytes = new byte[1024*1024];
int readCount=0;
//把数据读到byte数组里面
while((readCount = fis.read(bytes)) != -1){
//把byte数组里面的数据写出去,读多少写多少
fos.write(bytes,0,readCount);
fos.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//分别关闭
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return;
}
//找到目录中的文件,如果是文件进行复制
File[] files = srcFile.listFiles();
for(File file : files){
//获取文件的绝对路径(包括文件夹和文件)
//在目标文件夹后面新建复制过来的文件夹
if(file.isDirectory()){
//前面是父路径,后面是源文件截取掉盘符
File desDir = new File(desFile,file.getAbsolutePath().substring(2));
System.out.println(desDir.getAbsolutePath());
if(!desDir.exists()){
desDir.mkdirs();
}
}
// System.out.println(file.getAbsolutePath());
//不是文件,继续循环遍历,当前file
copyDir(file,desFile);
}
实现方式2
public static void main(String[] args) {
//复制的源文件夹
File src = new File("D:/xxx/Downloads/Compressed");
// 复制的目标文件夹
File desFile = new File("E:/xsq/a");
copyDir(src, desFile);
}
public static void copyDir(File src, File dest) {
if(src.isDirectory()){
File temp=new File(dest,src.getName());
temp.mkdirs();
for (File file : src.listFiles()) {
copyDir(file, temp);
}
}else{
copyFile(src, new File(dest,src.getName()));
}
}
/**
* 拷贝文件
* @param src
* @param dest
*/
public static void copyFile(File src, File dest) {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(src);
out = new FileOutputStream(dest);
byte[] b = new byte[1024];
int len = 0;
while (-1 != (len = in.read(b))) {
out.write(b, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


浙公网安备 33010602011771号