代码思路:
首先读取要拷贝的目录,然后根据这个目录的类型(目录/文件)进行分类,如果是目录,就递归调用子目录,如果是文件,就用IO流进行读取和写入。
新目录和新文件的创建涉及到字符串的拼接,这里要用绝对路径。
关于代码中的几个方法,可以网上查询,对于java常用类中的方法,我也会在后面总结一下。
package IOStreamTest;
//拷贝目录
import java.io.*;
public class FileTest {
public static void main(String[] args) {
File file = new File("C:\\Users\\lenovo\\Desktop\\JAVASE\\002-JavaSE每章作业");
File file2=new File("D:\\");
fileCopy(file,file2);
}
public static void fileCopy(File file,File file2){
//判断file是否为文件,如果是文件,则用文件输入输出流进行文件的复制。
if(file.isFile()){
//在这里创建in和out引用,使其作用域在if里面整个区域,保证后面可以关闭。
FileInputStream in = null;
FileOutputStream out=null;
try {
in =new FileInputStream(file);
//这里用了一个三目运算符解决file2的绝对路径以\\结尾的情况,通过+实现字符串拼接。
out =new FileOutputStream((file2.getAbsolutePath().endsWith("\\")?file2.getAbsolutePath():file2.getAbsolutePath()+"\\")+file.getAbsolutePath().substring(3));
byte[] bytes=new byte[1024*1024];
//flag表示读取的字符数量
int flag=0;
while((flag=in.read(bytes))!=-1){
out.write(bytes,0,flag);
}
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(out!=null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return;
}
//这个listFiles方法是获取子目录
File[] files = file.listFiles();
//增强for循环
for(File fileTest:files){
if(fileTest.isDirectory()){
String translate = fileTest.getAbsolutePath();
//System.out.println("ML"+translate.substring(3));
//System.out.println((file2.getAbsolutePath().endsWith("\\")?file2.getAbsolutePath():file2.getAbsolutePath())+"\\"+translate.substring(3));
File newDir=new File((file2.getAbsolutePath().endsWith("\\")?file2.getAbsolutePath():file2.getAbsolutePath()+"\\")+translate.substring(3));
if(!newDir.exists()){
newDir.mkdirs();
}
}
fileCopy(fileTest,file2);
}
}
}
如果有优化建议或者疑问,欢迎在评论区留言。