您的位置:首页 > 编程语言 > Java开发

java实现目录复制

2015-12-22 16:18 477 查看
最近安排任务写一个目录的复制,即将源文件或者文件夹中的内容复制到目标文件夹中。首先我们要区分几个名词:

目录和文件:比如一个文件夹就是一个目录,而一个 .txt 就是文件。

在JAVA中,File类提供了管理文件和目录的方法.先介绍一下用到的方法。

(1)file类的构造方法:

File(String pathname) :

File(String parent,String child)

File(File parent,String child)    // 注意是根目录的对象

(2)判断是文件还是目录

public boolean isFile()       // 判断是否是文件

public boolean isDirectory()    //  是否是目录

(3)public boolean mkdirs();   // 当File实例所表示的目录不存在时,建立新的目录以及父路径中各级原先不存在的父目录,并返回true.

mkdir() 是在该实例所表示的目录不存在,新建一个目录并返回true.

大概就这些需要强调,接下来就要看一下代码。有两种思路的代码实现判断文件和目录

先看一下测试类public class FileTest {
private static String inputPath = "G:/filetest/input/"; //源目录的路径
private static String outputPath = "G:/filetest/output"; //目标目录的路径
public static void main(String[] args){
MyFile myFile = new MyFile();
myFile.copyDir(inputPath, outputPath);
System.out.println("文件的大小:"+myFile.getLength(inputPath));
}
}
接下来是最重要的类 MyFile.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MyFile {

private int fileSum = 0; //记录目录的大小

//判断是目录还是文件
public void copyDir(String source,String dist){
File inputFile = new File(source);
File outputFile = new File(dist);
// 获取该目录中所有目录或者文件的file对象
// 这里就要注意 listFiles()方法和list()方法的区别
// listFiles()返回的是这些文件和子目录的File实例。
// list()返回的是File实例所表示目录中的所有文件和子目录的名字
File[] fileArray = inputFile.listFiles();
for(int i = 0;i<fileArray.length;i++){
File partFile = new File(outputFile,fileArray[i].getName());
// 是目录
if(fileArray[i].isDirectory()){
partFile.mkdirs();
// 递归调用
copyDir(source+"/"+fileArray[i].getName(), partFile.getPath());
}else{
// 复制内容 注意改变源路径和目标路径,在复制之前,该文件要在目录中创建,否则会报异常,总之还是要想清楚路径。
copy((new File(source,fileArray[i].getName())).getPath(),partFile.getPath());
}
}
}

public void copy(String source,String dist) {
int read = 0;
byte[] buffer = new byte[1024]; //从输入流读出多个字节到该数组中
try {
// 采用字节流。
FileInputStream inputStream = new FileInputStream(new File(source));
FileOutputStream outputStream = new FileOutputStream(new File(dist));
// 判断是否结束
while ((read = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, read);
}
// 一定要关闭输入输出流
inputStream.close();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
}
}
// 计算传入目录的大小,就是文件夹中所有文件的大小
public long getLength(String path) {
File file = new File(path);
int read = 0;
byte[] buffer = new byte[1024];
if (file.isDirectory()) {
String[] arr = file.list();
for (int i = 0; i < arr.length; i++) {
getLength(new File(path, arr[i]).getPath());
}
} else { //是文件
try {
FileInputStream inputStream = new FileInputStream(file);
// 从输入流中读出,并计算大小
while ((read = inputStream.read(buffer)) != -1) {
fileSum = fileSum + read;
}
inputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return fileSum;
}

}

要注意的地方已经在代码中标注,copyDir()函数还有另一种写法
public void copyDir(String inputPath, String outputPath) {
File inputFile = new File(inputPath);
File outputFile = new File(outputPath);

if (inputFile.isDirectory()) {
outputFile = new File(outputFile, inputFile.getName());
System.out.println("文件夹路径 = " + inputFile.getAbsolutePath());
outputFile.mkdirs();
String[] fileArray = inputFile.list();
for (int i = 0; i < fileArray.length; i++) {
copyDir(new File(inputFile, fileArray[i]).getPath(),
outputFile.getPath());
}
} else {
File partOutputFile = new File(outputFile.getPath(),
inputFile.getName());
System.out.println("文件路径=" + inputFile.getAbsolutePath());
try {
partOutputFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
copy(inputFile.getPath(),partOutputFile.getPath());
}
}

这个是 我最初的写的,但是因为一些意外,重写了一下,这两种方法都是正确的,就个人可以理解哪一种。
其实主要对输入输出流这一章各个函数的用法有一定的了解,写起来并不困难。还是要先看书,有思路在写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: