写了一个文件的复制,包括多级文件夹以及单个文件的复制,可以手工输入。
- import java.io.*;
- import java.util.*;
- /**
- * 问题:复制多级文件目录或者文件到另一个盘符中
- * 思路:
- * 1、将要复制的文件夹或者文件与文件API相关联
- * 2、创建一个存储要复制的文件的集合
- * 3、如果是复制多级目录则创建目的文件夹,如果只复制一个文件则不需要
- * 4、若复制的为目录则遍历文件夹中的文件,若遍历到文件夹则创建该文件夹,而如果是文件则将其路径和名称添加到集合中
- * 5、创建读取流与集合中的文件路径及名称相关联
- * 6、创建写入流与目的路径以及集合中的文件名称相关联
- * 7、读取需要复制的文件内容
- * 8、写入到目的路径中的文件中
- * 9、关闭流
- *
- */
- public class CopyMulFile {
- public static void main(String[] args){
- //手动输入要复制的文件目录或者文件名
- Scanner s = new Scanner(System.in);
- System.out.println("请输入要复制的文件目录或者文件名(格式如:e:\\\\hm 或者e:\\\\hm\\\\a.txt):");
- String dirName = s.next();
-
- //将要复制的文件夹或者文件与文件API相关联
- File sourDir = new File(dirName);
- if(!sourDir.exists()){
- System.out.println(sourDir+"文件不存在!");
- return;
- }
-
- //手动输入文件复制的目的目录
- System.out.println("请输入复制到的目的目录(格式如:i:\\\\hm\\\\):");
- String desName = s.next();
-
- //若要复制的是一个目录文件夹,则创建目的文件夹
- File desDir = new File(desName+sourDir.getName());;
- if(sourDir.isDirectory()){
- desDir.mkdir();
- if(!desDir.exists()){
- System.out.println(desDir+"文件不存在!");
- return;
- }
- }
-
- //创建一个存储要复制文件的集合
- List<File> list = new ArrayList<File>();
-
- //调用函数进行文件的复制
- addFile(list,sourDir,sourDir,desDir);
- copyFile(list,sourDir,desDir);
-
- }
-
- public static void addFile(List<File> list,File file,File sourDir,File desDir){
- if(sourDir.isDirectory()){
- File[] files = sourDir.listFiles();
- File dir = null;//目的文件夹
-
- //遍历文件夹中的文件
- for(int i=0;i<files.length;i++){
- //如果该文件是文件夹则在目的盘符中创建相应的文件夹,并递归遍历该文件夹中的内容。
- if(files[i].isDirectory()){
- String desName = files[i].toString().replace(file.toString(), desDir.toString());
- dir = new File(desName);
- dir.mkdir();
-
- addFile(list,file,files[i],desDir);//递归复制
- }
- //如果该文件不是文件夹则添加到复制列表中
- else
- list.add(files[i]);
- }
- }
- else
- list.add(file);
- }
-
- public static void copyFile(List<File> list,File sourDir,File desDir){
- //创建读取流与写入流
- BufferedInputStream bufis = null;
- BufferedOutputStream bufos = null;
-
- int count = 0;
- try{
- for(int i=0;i<list.size();i++){
- //读取流与要复制的文件相关联
- bufis = new BufferedInputStream(new FileInputStream(list.get(i)));
-
- //写入流与目的文件相关联
- String desName = list.get(i).toString().replace(sourDir.toString(), desDir.toString());
- bufos = new BufferedOutputStream(new FileOutputStream(desName));
-
- byte[] buf = new byte[1024];//创建临时存储缓冲区
- int len = 0;//读取长度标记
-
- //复制文件操作
- while((len=bufis.read(buf))!=-1){
- bufos.write(buf,0,len);
- bufos.flush();
- }
- count++;
- System.out.println(list.get(i)+"复制成功!");
- }
- System.out.println("复制成功"+count+"个文件");
- }catch(IOException e){
- throw new RuntimeException("复制操作失败!");
- }finally{
- try{
- if(bufos!=null)
- bufos.close();
- }catch(IOException e){
- throw new RuntimeException("关闭输出流失败!");
- }
- try{
- if(bufis!=null)
- bufis.close();
- }catch(IOException e){
- throw new RuntimeException("关闭输入流失败!");
- }
- }
- }
- }
复制代码
|