package practice;
import java.io.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* H:\Java\bin\server文件夹为空, 为什么会出现这种问题:
* if(infile.length() == 0)这行代码有问题,如果是文件夹的话(java/bin/server/),server
* 就算里面有文件,他也读不出来,只能读到server,所以以后判断里面有没有文件时,还是用File【】 a = ss.listFiles()
* 用a.length去判断
*/
public class Test02 {
public static void main(String[] args) {
java.util.Scanner in = new Scanner(System.in);
java.util.Scanner out = new Scanner(System.in);
Copy02 copy = new Copy02();
System.out.println("请输入起始目录(绝对路径)如 H:\\Java H:\\editPlus ");
String begin = in.next();
System.out.println("请输要复制到哪里的目录(如果是复制到盘里,直接输入盘的名称:如D: 或者输入绝对路径,如H:\\a\\b\\c\\d\\e ");
String over = out.next();
Date date = new Date();
SimpleDateFormat dd = new SimpleDateFormat("yyyy-MM--dd HH:mm:ss SSS");
double begintime = System.currentTimeMillis();
copy.copy02(begin,over);
Date date1 = new Date();
double overtime = System.currentTimeMillis();
// DecimalFormat df = new DecimalFormat("#.00");
// String time = df.format((overtime - begintime)/1000);
String time = String.format("%.2f",((overtime - begintime)/1000));
System.out.println("复制文件共用时 :" + time + " 秒");
}
}
class Copy02{
public void copy02(String in,String out){
//获取目录和文件
File infile = new File(in);
//由于file.listFiles()方法不能获取文件夹,所以要先把根目录建立
String chuShi = in.substring(2);
File file09 = new File( out + chuShi);
if(file09.exists()){
return;
}else {
file09.mkdir();
System.out.println(file09.toString() + "根目录建立成功!!!");
}
//看文件夹里的文件
File[] mulu = infile.listFiles();
if(mulu.length == 0){
System.out.println( infile + "文件夹为空,就这也要劳烦我JVM???");
return;
}else {
//文件夹里不为空的话,获取所有目录(或者文件路径)这方法只能获取文件,不能获取文件夹
//其实也能读到文件夹,不过位置不确定,可能回最后读到
for (File wenjian : mulu) {
//如果是文件,返回
if (!(wenjian.isDirectory())) {
FileInputStream inputStream = null;
FileOutputStream outputStream = null;
//开始复制(文件)
try {
inputStream = new FileInputStream(wenjian);
/**
* 注意:这个new 里面可以传个File,就是上面的wenjian
* 假设复制到I盘:H:\editPlus \editPlus,从第二个字符开始截取
*/
String luJing = wenjian.getAbsolutePath().substring(2);
System.out.println((out + luJing )+ "复制成功!!!");
outputStream = new FileOutputStream(out + luJing);
byte[] bytes = new byte[1024 * 1024]; //1MB
int readCount = 0;
while((readCount = inputStream.read(bytes)) != -1){
outputStream.write(bytes,0,readCount);
}
outputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} else {
copy02(wenjian.getAbsolutePath(),out);
//是文件夹,直接调用它本身,方法开头会建立文件夹
}
}
}
}
}
下面的只能copy一个文件夹,也是失败的
package practice;
import java.io.*;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
java.util.Scanner in = new Scanner(System.in);
java.util.Scanner out = new Scanner(System.in);
Copy copy = new Copy();
System.out.println("请输入起始目录(绝对路径):");
String begin = in.next();
System.out.println("请输要复制到哪里的目录(如果是复制到盘里,直接输入盘的名称:如D: 或者输入绝对路径,如H:\\a\\b\\c\\d\\e ");
String over = out.next();
copy.copy(begin,over); //H:\editPlus
}
}
class Copy{
public void copy(String in,String out){
//获取目录和文件
File infile = new File(in);
// File[] mulu01 = infile.listFiles();
//由于file.listFiles()方法不能获取文件夹,所以要先把根目录建立
String chuShi = null;
//in.length() == 1 ? chuShi = in.substring(2) : chuShi =
chuShi = in.substring(2);
File file09 = new File( out + chuShi);
if(file09.exists()){
return;
}else {
file09.mkdir();
System.out.println(file09.toString() + "根目录建立成功!!!");
}
if(infile == null){
return;
}else {
//文件夹里不为空的话,获取所有目录(或者文件路径)
//这方法只能获取文件,不能获取文件夹
File[] mulu = infile.listFiles();
for (File wenjian : mulu) {
//如果是文件,返回
if (wenjian.isFile()) {
String i = wenjian.getAbsolutePath();
FileInputStream inputStream = null;
FileOutputStream outputStream = null;
//开始复制(文件)
try {
inputStream = new FileInputStream(i);
//假设复制到I盘:H:\editPlus \editPlus,从第二个字符开始截取
String luJing = i.substring(2);
//Out + luJing = I + :editPlus
String outLuJing = out + luJing;
System.out.println(outLuJing);
System.out.println(outLuJing + "复制成功!!!");
outputStream = new FileOutputStream(outLuJing);
byte[] bytes = new byte[1024 * 1024]; //1MB
int readCount = 0;
while((readCount = inputStream.read(bytes)) != -1){
outputStream.write(bytes,0,readCount);
}
outputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} else {
//不是文件(说明是文件夹)
String wenJianJiaLuJing = wenjian.getAbsolutePath();
String luJing01 = wenJianJiaLuJing.substring(2);
File file01 = new File( out + luJing01);
//看这个文件夹在I盘是否存在
if(file01.exists()){
return;
}else {
file01.mkdirs();
System.out.println(file01.toString() + "文件夹复制成功0000000000000000000");
}
copy(wenjian.getParent(),out);
}
}
}
}
}