🍜使用IO流编写文件夹拷贝功能
- 使用到字节流FileInputStream、FileOutputStream、BufferedFileInputStream/BufferedFileOutputStream,以及常用方法
1、首先通过用户输入要拷贝文件夹目录
- file01是要拷贝的文件夹路径
- file02是要拷贝目标目录路径
- dir():方法用于用户对路径的输入处理
//main方法
public static void main(String[] args) throws IOException {
File file01=dir();
File file02=dir();//此处调用dir()方法
//判断两个路径是不是一个路径
if(file01.equals(file02)){
System.out.println("源目录与目的目录属于一个目录!");
// throw new IllegalArgumentException("源目录与目的目录属于一个目录!");
}else{
copy(file02,file01);
}
}
//dir()方法:处理用户对路径的输入
private static File dir() throws FileNotFoundException{
System.out.println("请输入路径:");
File dir=new File(new Scanner(System.in).next());
//对路径的判断
while(true){
if(!dir.exists()){
System.out.println("路径不存在!");
//throw new FileNotFoundException("FileNotFound");
}else if(dir.isFile()){
System.out.println("请输入文件路径!");
//throw new FileNotFoundException("FileNotFound");
}else{
return dir;
}
}
}
}
2、核心文件的读写拷贝,文件夹的处理
- 使用到递归实现多层目录的拷贝
private static void copy(File file02, File file01) throws IOException {
File toDir=new File(file02,file01.getName());//拼接成目的目录
//判断目的目录是否已经纯在,存在则创建
if(!(toDir.exists())){
toDir.mkdirs();
}
File[] file=file01.listFiles();//获取原文件的全部文件到数组中
for (File f: file) {
if(f.isFile()){//判断是否是普通文件
InputStream input=new BufferedInputStream(new FileInputStream(f));
OutputStream output=new BufferedOutputStream(new FileOutputStream(new File(toDir,f.getName())));
int len;
while((len=input.read())!=-1){
output.write(len);
}
output.flush();
output.close();
input.close();
} else{
copy(toDir,f);//递归,内部文件夹则递归处理再来一遍
}
}
}
测试:
- 准备了file01文件夹和file02文件夹
- 运行测试
最终结果:
成功!完结撒花!(上面的对路径的判断处理可以优化成异常处理)
补充:ArrayList模仿编写
public class ArrayLists {
public static void main(String[] args) {
ArraysList as=new ArraysList();
as.add("abc");
as.add("dd");
as.add("dd");
as.remove(2);
as.remove(5);
}
}
class ArraysList{
private String[] elementData;
public ArraysList() {
}
public int getSize() {
return size;
}
private int size;
//添加元素
public void add(String data){
//获取原数组
String[] ele=elementData;
//将原数组的指引指向新数组
elementData=new String[size+1];
for (int i = 0; i < size; i++) {
elementData[i]=ele[i];
}
//添加
elementData[size++]=data;
System.out.println(Arrays.toString(elementData));
}
//删除元素
public void remove(int index){
//判断
if(index<0||index>size){
throw new IndexOutOfBoundsException("数组越界!");
}
String[] eledelete=elementData;
//删除后的新数组
elementData=new String[size-1];
int j=0;
for (int i = 0; i < size; i++) {
if(!(i==index)){
elementData[j++]=eledelete[i];
}
}
System.out.println(Arrays.toString(elementData));
size--;
}
}
结果:
这里只写了add添加和删除delete,大概ArraryList底层就是这样