1.文件夹复制
package Copy;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class DirCopyDemo {
public static String srcRoot;
public static void main(String[] args) throws Exception {
copyDir("d:/a/", "d:/b");
}
/**
* 复制文件夹
* @throws Exception
*/
public static void copyDir(String srcDir,String destDir) throws Exception{
if(srcRoot == null){
srcRoot = srcDir;
}
//源文件夹
File srcFile = new File(srcDir);
//目标文件夹
File destFile = new File(destDir);
//判断srcFile有效性
if(srcFile == null || !srcFile.exists()){
return;
}
//创建目标文件夹
if(destFile.exists()){
destFile.mkdirs();
}
//判断是否是文件
if(srcFile.isFile()){
String absPath = srcFile.getAbsolutePath();
//取出上级目录
String parentDir = new File(srcRoot).getParent();
//取出相对路径
String relPath = absPath.substring(parentDir.length());
File destFile2 = new File(destDir,relPath);
//拷贝文件
copyFile(srcFile.getAbsolutePath(),destDir);
}
//目录
else{
File[] children = srcFile.listFiles();
if(children != null){
for(File f : children){
copyDir(f.getAbsolutePath(), destDir);
}
}
}
}
/*
* 复制文件
*/
public static void copyFile(String file,String destDir) throws Exception{
try {
//准备目录
String tmp = file.substring(srcRoot.length());
String folder = new File(destDir,tmp).getParentFile().getAbsolutePath();
File destFolder = new File(folder);
destFolder.mkdirs();
File f = new File(file);
FileInputStream fis = new FileInputStream(file);
if(destDir.endsWith("/") || destDir.endsWith("\\")){
}
else{
}
//
FileOutputStream fos = new FileOutputStream(new File(destFolder,new File(file).getName()));
byte[] buf = new byte[1024];
int len = 0;
while((len = fis.read(buf)) != -1){
fos.write(buf, 0, len);
}
fis.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
递归:函数自己调用自己,递归时一定要明确结束条件
2.深度复制
package IO;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class DeepCopyDemo {
public static void main(String[] args) throws Exception {
/**
* 对象图
*/
Cat c = new Cat() ;
Person p = new Person() ;
Dog d = new Dog() ;
c.setOnwer(p) ;
c.setNeibor(d);
//浅度对象图
Cat c2 = new Cat(); //c2的地址和c不一样,但是c2的p和d与c的p和d地址相同
c2.setOnwer(p);
c2.setNeibor(d);
//深度复制
/*******************写入(串行)*********************/
//字节数组输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();//写到内存里
//对象输出流
ObjectOutputStream oos = new ObjectOutputStream(baos);
//串行化
oos.writeObject(c2);
oos.close();
baos.close();
/******************读取(反串行)*********************/
byte[] bytes = baos.toByteArray();//从内存中取
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);//从内存中取
ObjectInputStream ois = new ObjectInputStream(bais);
Cat cc = (Cat) ois.readObject(); //不仅cc和c的地址不同,cc的onwer和neibor与c的onwer和neibor地址都不一样,实现了深度复制
ois.close();
bais.close();
}
}
package IO;
import java.io.Serializable;
public class Cat implements Serializable{
private static final long serialVersionUID = -1451093463894453310L;
private String name ;
private int age ;
private Person onwer ;
private Dog neibor ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person getOnwer() {
return onwer;
}
public void setOnwer(Person onwer) {
this.onwer = onwer;
}
public Dog getNeibor() {
return neibor;
}
public void setNeibor(Dog neibor) {
this.neibor = neibor;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public Cat(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Cat() {
super();
}
}
package IO;
import java.io.Serializable;
public class Person implements Serializable{
/**
*
*/
private static final long serialVersionUID = 8875314054714509757L;
private String name ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package IO;
import java.io.Serializable;
public class Dog implements Serializable{
/**
*
*/
private static final long serialVersionUID = 4668620775367884307L;
private String name ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}