拷贝文件夹及其子文件和子目录
这两天学习了IO流,所以做了一个小Demo,挺有趣的。
拷贝的文件大概率是没问题的,如果被拷贝的目录被其它程序占用可能会出现一点问题。
1. 拷贝目录大多用的是File类方法。
2. 拷贝文件用的是IO流。FileInputStream和FileOutputStream,这两个流是万能的,所有类型的文件都可以复制。
3. 子目录是利用递归不停循环调用拷贝目录的方法。
4. 这个花了一些时间,主要遇到的一个问题就是,你下一次要拷贝的路径和目标路径一定要想好是哪一个。
其它也就没啥了
日志工具类用的是标准输出流:PrintStream ,当然也可以使用其它流
package com.File;
import com.log.logger;
import java.io.*;
// 拷贝目录
public class CopyDirectory {
// listFile()循环获取
// 拷贝目录
public static void CopyDirectory(String filePath, String copyPath){ // 参数是要copy的文件目录
File file = new File(filePath); // 要拷贝的文件
File copyFile = new File(copyPath); // 要拷贝的目录
if (!file.exists()||!copyFile.exists()){
System.out.println("要拷贝的目录或者拷贝的目的地不存在");
}
File[] listFiles = file.listFiles();// 获取当前目录的所有子目录
int length = listFiles.length;
for (int i = 0; i < length; i++) {
// 先在目的地创建需要拷贝的父文件夹
String fileParentPath = copyPath + "/" + file.getName();
File fileP = new File(fileParentPath);
if (!fileP.exists())if (!fileP.mkdir())fileP.mkdirs();
if (listFiles[i].isFile()){//拷贝子文件
copyFile(listFiles[i],fileParentPath+"/"+listFiles[i].getName());
}
// 接下来拷贝子目录
if (listFiles[i].isDirectory()){ // 如果是目录
String name = listFiles[i].getName();//当前要创建的文件夹名称
String childFilePath = fileParentPath + "/" + name;
File nullDirectory = new File(childFilePath);
if (!nullDirectory.exists()){//如果不存在
if (!nullDirectory.mkdir()){//直接创建
nullDirectory.mkdirs();
}
}
if (listFiles[i].listFiles().length!=0){//如果文件夹不为空
CopyDirectory(listFiles[i].getAbsolutePath(),fileParentPath); // 子目录要拷贝的路径
}
}
}
}
// 拷贝单个文件
public static void copyFile(File file,String copyPath){//file: 拷贝的文件 copyPath:拷贝目的地
System.out.println("正在拷贝的文件:"+copyPath);
logger.log("正在拷贝的文件"+copyPath);
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
byte[] bytes = new byte[1024];
int i = 0;
try {
fileInputStream = new FileInputStream(file);
fileOutputStream = new FileOutputStream(copyPath);
while((i=fileInputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,i);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fileInputStream!=null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutputStream!=null){
try {
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
//filepath: 要拷贝的文件目录
// copyPath:目的地
CopyDirectory("E:/Git_Study/IO","C:/Users/l/Desktop");
}
}
日志工具类
package com.log;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
public class logger {
public static void log(String msg) {
Date date = new Date();
String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
PrintStream printStream = null;
try {
printStream = new PrintStream(new FileOutputStream("src/main/resources/log/my.log", true));
printStream.println(format+":"+msg);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}