package com.itheima.d1_fileClone;
import java.io.*;
public class DirectoryCopy {
public static void main(String[] args) throws Exception {
copyDirectory(new File("F:\\one"),new File("G:\\"));
}
public static void copyDirectory(File oriFile, File newFile) throws Exception {
//先找到文件目录:有这个目录,不是空的
if (oriFile!=null && oriFile.isDirectory()){
//目标位置,创建目录
File newPath = new File(newFile,oriFile.getName());
newPath.mkdirs();
//得到目录下的所有文件
File[] files = oriFile.listFiles();
//先判断文件是不是空的,再遍历文件
if (files!=null){
for (File fileEach:files){
if (fileEach.isFile()){
copyFile(fileEach,new File(newPath,fileEach.getName()));
}else {
copyDirectory(fileEach,newPath);
}
//文件如果是 文件类型就复制,文件夹就递归
}
}
}
else {
System.out.println("没有这个文件夹,路径错误!");
}
}
public static void copyFile(File InpFile,File OutFile) throws Exception {
//单纯复制文件
OutputStream os = new FileOutputStream(OutFile);
InputStream is = new FileInputStream(InpFile);
//得到两个流:输入输出
byte[] buffer = new byte[1024];
while (is.read(buffer)!=-1){
os.write(buffer);
}
System.out.println("该文件复制完毕");
//while复制
os.close();
is.close();
//复制完了就关了is 和 os
}
}
関数は 2 つあり、1 つは元のディレクトリ内のすべてのファイルを取得して走査し、ファイルであると判断された場合はファイルをコピーする関数を呼び出し、ファイル (フォルダー) ではない場合は再帰する必要があります。もう1つはファイルコピー機能です。
while (is.read(buffer)!=-1) として自分で書いたとき、その行は while (is.read(buffer)!=0) のように書かれ、効果は直接逆になりました。コピーされたファイルのサイズが非常に大きいため、開くことができません。
そこで、バイト入力ストリームの読み取り関数を検索しました。
最後まで読んだ後は-1を返すという意味です
ドキュメントの確認はとても重要なのでここに書いておきます