修改后的CopyFile类

这是修改后的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");
    }
}
时间: 2024-08-02 11:03:01

修改后的CopyFile类的相关文章

5.26在网上看到的方法,实现图形缩放、对齐、图形修改后进行dirty check。(未实验过)

目标:1. 使用ZoomManager来执行图形的缩放2. 对图形进行对齐(Alignment)操作3. 图形修改后进行dirty check(提示保存文档) 图形缩放:提供缩放能力的方法就是设置根图形的RootEditPart为ScalableRootEditPart.一般在Editor的configureGraphicalViewer()方法中设置RootEditPart.ScalableRootEditPart提供了一个ZoomManager类用来管理图形的缩放操作.通过该ZoomMana

js/css文件修改后浏览器本地缓存解决

本文实例讲述了让html页面随js的修改来更新缓存的实现方法.分享给大家供大家参考.具体实现方法如下: 很多朋友都会碰到这样的情况:如果我们页面加载了js的话下次打开时也会是调用这个js缓存文件,但对于我们修改后调试和发布是非常的不方便了,本文就来谈论如何解决这一问题,下面一起来看看. 一.后台编写一个 UrlCommon的js/css url的连接操作类 1 using System; 2 using System.Collections.Generic; 3 using System.Lin

java记录对象前后修改的内容(工具类)

有时候业务需要,需记录一条记录的修改历史,但是不能为完成任务而硬编码,不靠谱 这种情况可以使用java反射来完成 对对象属性的描述可以通过自定义注解来完成,读取里面的属性进而记录修改历史. 在对象的属性上面加上注解,value设置为属性的中文描述 工具了代码如下 util类(BeanChangeUtil) 1 import java.beans.PropertyDescriptor; 2 import java.lang.reflect.Field; 3 import java.lang.ref

解决Ext4.2.3中propertyGrid修改后点击排序报错

Ext4.2.3中PropertyGrid修改后点击排序报错,具体错误信息如下: 一开始还怀疑是自己哪里配置错了,各种尝试结果还是一样.查遍百度和谷歌,无果,只有一篇帖子说是4.2.4修正了.还是自己动手吧,自己动手丰衣足食. 点开报错地方(如下图所示),原来是me.field.column没有定义. 然后继续找,找啊找啊找到Ext.grid.property.Grid的getCellEditor方法.此方法有参数column,可在方法体内,column就没有被用到过,于是就感觉问题出在这里.

SQLSERVER中返回修改后的数据

在公司看到同事写了个SQL2005的新特性的文章,觉得很实用,在这里和大家分享下. 这种技术主要是用到了inserted和deleted虚拟表,这两张表相信大家都很熟悉.以前我们主要是在触发器中使用. 我们先来复习下这两个表: Inserted和Deleted这两个表是逻辑表,并且这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此,不允许用户直接对其修改.这两个表的结构与被该触发器作用的表在相同的表结构.这两个表是动态驻留在内存中的,当触发器工作完成,它们也被删除. 接下来,看看我们

/profile文件修改后立即生效

修改profile etc/profile文件是只读的,直接用vi或gedit打开修改后是无法保存的.要修改profile,需要取得root权限,(使用gedit编辑) $sudo gedit /etc/profile 或者 $sudo -s $gedit /etc/profile 这样打开profile文件,修改后就可以保存了. /profile文件修改后立即生效 方法1: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # .  /etc/profile 注意: . 和

Java基础-接口.编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法void printCapitalLetter();在接口InterfaceB中有个方法void printLowercaseLetter();然 后写一个类Print实现接口InterfaceA和InterfaceB,要求 方法 实现输出大写英文字母表的功能,printLowerca

#34.编写2个接口:InterfaceA和InterfaceB:在接口InterfaceA中有个方法void printCapitalLetter():在接口InterfaceB中有个方法void printLowercaseLetter():然 后写一个类Print实现接口InterfaceA和InterfaceB,要求      方法 实现输出大写英文字母表的功能,printLowercaseLetter()方法实现输出小写英文 字母表的功能.再写一个主类E,在主类E的main方法中创建P

wamp中修改后mysq数据库l闪退无法登陆解决办法

WampServer安装后密码是空的, 修改一般有三种方式: 一是通过phpMyAdmin直接修改: 二是使用WAMP的MySql控制台修改. 三是重置密码 第一种: 1.在phpMyAdmin界面中点击[用户],将用户概况中的所有用户名为[root] 用户的密码都改为[要修改的密码]. 修改是点击[编辑权限],设置密码即可. 2.在目录wamp\apps下找到phpmyadmin文件夹下的[config.inc.php]文件, 修改[$cfg['Servers'][$i]['password'

使用while语句修改后的效果和for一样

while循环语句我们使用while修改之前Demo10的跑1000米的程序哈:使用while语句修改后的效果和for一样哈.那我们怎么样知道什么时候用for循环,什么时候用while循环呢? 当明确知道要循环的次数的时候,就使用for循环 当不确定循环次数,只知道循环结束条件时,可以使用while循环.注意事项比如刚刚的程序,如果我们把i++修改循环条件的语句注释掉,我们看下效果哈.我们发现程序一直在跑第一圈哈,程序进入死循环了哈.2.直到型结构do...while循环语句While是先判断再