前言
说明:把指定文件夹下的指定文件类型复制到另一个指定的目录,不管目录有多深,会递归把这个目录下所有符合类型的文件复制到指定的目录。(指定的目录会自动创建)
为什么会写这个工具代码,因为我用 哔哩哔哩 windows版下载视频时候发现,下载下来的视频它的目录结构比较深,它是一类视频在一个文件夹下,该文件夹下的每一个视频都独占一个文件夹,使用别的视频播放器看视频极其不方便,想着把它集中到一个文件夹,手动复制出来太麻烦且效率太低,所以想着用代码把它的视频复制出来就行。
执行命令
java Copy 参数1 参数2 参数3
命令行手动执行
编译:javac -encoding UTF-8 Copy.java
运行:java Copy C:\Users\ibbd\Desktop\app C:\Users\ibbd\Desktop\temp\temp sql
这个运行就是命令就是把桌面 app 目录下的 sql 文件复制到桌面的 temp\temp 目录下(temp 目录如果不存在则会自动创建)
windows 批处理执行
1、新建 copy.bat
2、写入以下内容
:: windows 批处理
start cmd /k "javac -encoding UTF-8 Copy.java && java Copy C:\Users\ibbd\Desktop\app C:\Users\ibbd\Desktop\temp\temp sql"
复制文件代码
import java.io.*;
import java.nio.channels.FileChannel;
public class Copy {
private static String sourcePath = "C:\\Users\\ibbd\\Desktop\\app\\logs";
private static String downloadPath = "C:\\Users\\ibbd\\Desktop\\temp";
private static String fileType = "mp4";
public static void main(String[] args) {
if (args != null && args.length >= 2) {
sourcePath = args[0];
System.out.println("参数传递-源文件目录:" + args[0]);
downloadPath = args[1];
System.out.println("参数传递-把文件复制到这个目录:" + args[1]);
if (args.length >= 3) {
fileType = args[2];
System.out.println("参数传递-要复制的文件类型:" + args[2]);
}
}
File file = new File(sourcePath);
try {
long l = System.currentTimeMillis();
bulkCopyFile(file, fileType, downloadPath);
long time = System.currentTimeMillis() - l;
System.out.println("耗时:" + time + " 秒:" + time / 1000);
} catch (IOException e) {
e.printStackTrace();
System.out.println("复制文件出现异常,原因:" + e.getMessage());
}
}
public static void bulkCopyFile(File fs, String fileType, String target) throws IOException {
if (fs.isDirectory()) {
File[] files = fs.listFiles();
for (File file : files) {
bulkCopyFile(file, fileType, target);
}
return;
}
if (fs.isFile() && fileSuffix(fs.getName(), fileType)) {
quickCopy(fs, target);
}
}
public static void quickCopy(File src, String target) {
try {
System.out.println(src.getName() + " 进入快速复制程序...");
File targetPath = new File(target);
if (!targetPath.exists()) {
targetPath.mkdirs();
}
File targetFile = new File(targetPath + File.separator + src.getName());
System.out.println("源文件位置:" + src.getAbsolutePath());
System.out.println("目标文件位置:" + targetFile.getAbsolutePath());
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(targetFile);
FileChannel inputChannel = fis.getChannel();
FileChannel outputChannel = fos.getChannel();
inputChannel.transferTo(0, inputChannel.size(), outputChannel);
outputChannel.close();
inputChannel.close();
fos.close();
fis.close();
System.out.println(src.getName() + " 快速复制成功!");
} catch (IOException e) {
System.out.println(src.getName() + " 快速复制失败,原因:" + e.getMessage());
}
}
public static void copy(File src, String target) {
try {
System.out.println(src.getName() + " 进入复制程序...");
File targetPath = new File(target);
if (!targetPath.exists()) {
targetPath.mkdirs();
}
File targetFile = new File(targetPath + File.separator + src.getName());
System.out.println("源文件位置:" + src.getAbsolutePath());
System.out.println("目标文件位置:" + targetFile.getAbsolutePath());
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(targetFile);
byte[] buffer = new byte[1024];
int n;
while ((n = fis.read(buffer)) != -1) {
fos.write(buffer, 0, n);
}
fos.close();
fis.close();
System.out.println(src.getName() + " 复制成功!");
} catch (IOException e) {
System.out.println(src.getName() + " 复制失败,原因:" + e.getMessage());
}
}
public static boolean fileSuffix(String fileName, String suffix) {
if (fileName == null || suffix == null) {
return fileName == suffix;
}
int index = fileName.lastIndexOf(".");
if (index < 0) {
return false;
}
String fileSuffix = fileName.substring(index + 1);
return fileSuffix.equals(suffix);
}
}
|