码迷,mamicode.com
首页 > 其他好文 > 详细

修改后的CopyFile类

时间:2016-07-13 22:33:49      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:

这是修改后的CopyFile类,前面那个类有局限性,它不能复制大文件

这是我第一次写成一个能够实际应用的类,感谢博主们的无私奉献,感谢SeayXu老师的提点

但是这个类也并不是完美无缺,它复制文件没有问题,但是如果是复制文件夹,复制后占用的空间会和原先有略微的不一样,但是不影响数据的完整性(文件大小一样,但是占用的空间有差别)

这个类的完成也标志着文件操作的学习暂时告一段落,进入Socket领域

 

这个类主要是4个public方法和两个private方法组成,类虽然很长,但是精髓只是copyData(File,File)方法

 

package com.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 里面主要的方法只有4个,通过一定的逻辑判断具体调用哪个方法
 * @author Dawn
 *
 */
public class CopyFileTwo {
    /**
     * 在同目录下拷贝文件,加上文件名的命名逻辑
     * @param srcFilePath        源文件路径
     * @param destFilePath    目标文件路径
     */
    public static void copyFileSamePath(String srcFilePath,String destFilePath){
        File srcFile=new File(srcFilePath);
        File destFile=new File(destFilePath);
        if(!srcFile.exists()){
            System.out.println("源文件不存在");
            return;
        }
        if(!(srcFile.getPath().equals(destFile.getPath()))){
            System.out.println("方法调用错误:只复制同一个目录下的文件");
            return;
        }
        if(!srcFile.isFile()){
            System.out.println("方法调用错误:源文件不是单个的文件");
            return;
        }
        File newFile=naming(destFile);
        try{
            newFile.createNewFile();
        }catch(IOException e){
            e.printStackTrace();
        }
        copyData(srcFile,newFile);
    }
    /**
     * 次要方法,用来给同目录下的新建的文件和文件夹命名
     * @param destFile        目标File类的引用
     * @return                    返回更名后的File类的引用
     */
    private static File naming(File destFile){
        File newFile=null;
        int increasing=2;
        String folder=destFile.getParent();
        String fileName="复件"+destFile.getName();
        String newPath=folder+File.separator+fileName;
        newFile=new File(newPath);
        while(newFile.exists()){
            fileName="复件"+increasing++ +" "+destFile.getName();
            newPath=folder+File.separator+fileName;
            newFile=new File(newPath);
        }
        return newFile;
    }
    /**
     * 次要方法,专门用来传输数据
     * @param srcFile        源文件的File类引用
     * @param destFile    目标文件的File类引用
     */
    private static void copyData(File srcFile,File destFile){
        try{
            FileInputStream reader=new FileInputStream(srcFile);
            FileOutputStream writer=new FileOutputStream(destFile);
            int length=0;
            byte[] dataBytes=new byte[4096];
            while((length=reader.read(dataBytes))!=-1){
                writer.write(dataBytes,0,length);
            }
            reader.close();
            writer.close();
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
    /**
     * 在不同目录下拷贝文件
     * @param srcFilePath        源文件路径    
     * @param destFilePath    目标文件路径    
     * @param overlay            是否覆盖
     */
    public static void copyFileDifferentPath(String srcFilePath,String destFilePath,boolean overlay){
        File srcFile=new File(srcFilePath);
        File destFile=new File(destFilePath);
        if(!srcFile.exists()){
            System.out.println("源文件不存在");
            return;
        }
        if(srcFile.getPath().equals(destFile.getPath())){
            System.out.println("方法调用错误:只能复制到不同的目录下");
            return;
        }
        if(!srcFile.isFile()){
            System.out.println("方法调用错误:只能复制文件");
            return;
        }
        if(!(srcFile.getName().equals(destFile.getName()))){
            System.out.println("输入错误:文件名不一样");
            return;
        }
        if(destFile.exists()){
            if(overlay){
                destFile.delete();
            }else{
                System.out.println("文件重名");
                return;
            }
        }
        try{
            destFile.createNewFile();
        }catch(IOException e){
            e.printStackTrace();
            return;
        }
        copyData(srcFile,destFile);
    }
    /**
     * 在不同的目录下拷贝文件夹
     * @param srcFolderPath        源文件夹路径
     * @param destFolderPath    目标文件夹路径    
     * @param overlay                是否覆盖
     */
    public static void copyFolderDifferentPath(String srcFolderPath,String destFolderPath,boolean overlay){
        File srcFolder=new File(srcFolderPath);
        File destFolder=new File(destFolderPath);
        if(!srcFolder.exists()){
            System.out.println("源文件不存在");
            return;
        }
        if(srcFolder.getPath().equals(destFolder.getPath())){
            System.out.println("方法调用错误:只能复制到不同的目录下");
            return;
        }
        if(!srcFolder.isDirectory()){
            System.out.println("方法调用错误:只能复制文件夹");
            return;
        }
        if(!(srcFolder.getName().equals(destFolder.getName()))){
            System.out.println("输入错误:文件名不一样");
            return;
        }
        if(destFolder.exists()){
            if(overlay){
                File[] files=srcFolder.listFiles();
                int size=files.length;
                for(int i=0;i<size;i++){
                    if(files[i].isFile()){
                        copyFileDifferentPath(files[i].getPath(),destFolder.getPath()+File.separator+files[i].getName(),true);
                    }else{
                        copyFolderDifferentPath(files[i].getPath(),destFolder.getPath()+File.separator+files[i].getName(),true);
                    }
                }
            }else{
                System.out.println("文件夹重名");
                return;
            }
        }else{
            destFolder.mkdirs();
            copyFolderDifferentPath(srcFolderPath,destFolderPath,true);
        }
    }
    public static void copyFolderSamePath(String srcFolderPath,String destFolderPath){
        File srcFolder=new File(srcFolderPath);
        File destFolder=new File(destFolderPath);
        if(!srcFolder.exists()){
            System.out.println("源文件夹不存在");
            return;
        }
        if(!(srcFolder.getPath().equals(destFolder.getPath()))){
            System.out.println("方法调用错误:只复制同一个目录下的文件夹");
            return;
        }
        if(!srcFolder.isDirectory()){
            System.out.println("方法调用错误:源文件不是单个的文件夹");
            return;
        }
        File newFolder=naming(destFolder);
        newFolder.mkdirs();
        File[] files=srcFolder.listFiles();
        int size=files.length;
        for(int i=0;i<size;i++){
            if(files[i].isFile()){
                copyFileDifferentPath(files[i].getPath(),newFolder.getPath()+File.separator+files[i].getName(),false);
            }else{
                copyFolderDifferentPath(files[i].getPath(),newFolder.getPath()+File.separator+files[i].getName(),false);
            }
        }
        
    }
    /**
     * 测试用main方法
     * @param args
     */
    public static void main(String[] args){
        copyFileSamePath("F:\\World of  Warcraft\\Data\\data\\data.019","F:\\World of  Warcraft\\Data\\data\\data.019");
    }
}

 

修改后的CopyFile类

标签:

原文地址:http://www.cnblogs.com/xzxdm/p/5667604.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!