标签:
这是修改后的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"); } }
标签:
原文地址:http://www.cnblogs.com/xzxdm/p/5667604.html