A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴光新 黑马帝   /  2013-8-1 20:13  /  1119 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;

  7. class CopyPath{
  8. public static void main(String[] args)throws IOException{
  9. String copyPathStr = "F:\\test"; //要复制的文件夹
  10. String savePathStr = "F:\\copy"; //要保存到哪里
  11. System.out.println("正在复制...");
  12. copyPath(copyPathStr,savePathStr);
  13. System.out.println("复制成功");
  14. }
  15. /**
  16. * 复制文件夹,本例没有包含该文件夹,只复制该文件夹下的所有文件及文件夹。
  17. * @param copyPathStr 要复制的文件夹
  18. * @param savePathStr 要复制到哪个文件夹下
  19. */
  20. public static void copyPath(String copyPathStr,String savePathStr){
  21. //首先用接收到的两个字符串创建成文件对象
  22. File copyPath = new File(copyPathStr);
  23. File savePath = new File(savePathStr);

  24. //判断保存的目录是否存在
  25. if (!(copyPath.exists())){
  26. System.out.println("保存的目录不是有效目录!");
  27. System.exit(0);
  28. }
  29. //判断在该目录下是否有相同的文件存在
  30. if (savePath.exists()){
  31. System.out.println("复制失败!文件夹重复");
  32. System.exit(0);
  33. }
  34. //创建主目录
  35. savePath.mkdirs();

  36. //获取该目录下所有文件及文件夹的数组列表
  37. File[] files = copyPath.listFiles();
  38. File pathStr = null;
  39. for(File file : files){
  40. //建立保存的目录
  41. pathStr = new File(savePathStr+(file.toString().replace(copyPathStr, "")));
  42. //如果是目录,再次调用fileToList方法。并创建目录
  43. if(file.isDirectory()){
  44. copyPath(file.toString(),pathStr.toString());
  45. pathStr.mkdirs();
  46. }
  47. //如果是文件,就调用复制文件的方法
  48. if(file.isFile()){
  49. copyFile(file,pathStr);
  50. }
  51. }
  52. }
  53. /**
  54. * 复制文件
  55. * @param file 要复制的文件绝对路径
  56. * @param path 要保存到的目录
  57. */
  58. public static void copyFile(File file,File path){
  59. BufferedInputStream bis = null;
  60. BufferedOutputStream bos = null;
  61. try{
  62. //若以上判断都通过,就创建输入流和输出流。
  63. bis = new BufferedInputStream(new FileInputStream(file));
  64. bos = new BufferedOutputStream(new FileOutputStream(path));
  65. //创建数组,指定大小为available方法获取的读取流中的字节数。
  66. byte[] bytes = new byte[bis.available()];
  67. //保存数据
  68. bis.read(bytes);
  69. bos.write(bytes);
  70. }
  71. catch(IOException e){
  72. throw new RuntimeException("复制文件失败");
  73. }
  74. //关闭流资源
  75. finally{
  76. try{
  77. if (bis!=null){
  78. bis.close();
  79. }
  80. }
  81. catch(IOException e){
  82. throw new RuntimeException("输入流关闭失败");
  83. }
  84. try{
  85. if (bos!=null){
  86. bos.close();
  87. }
  88. }
  89. catch(IOException e){
  90. throw new RuntimeException("输出流关闭失败");
  91. }
  92. }
  93. }
  94. }
复制代码
思路:
1、主函数传递两个字符串到copyPath类,一个是要复制的文件夹,一个是要保存在哪个文件夹下
2、copyPath类接收后用这两个字符串分别创建成目录对象,并作一些判断。
3、判断通过后,就用要保存到的哪个目录创建一个主目录,用listFiles方法封装一个源目录下所有的文件名称的数组
4、用for遍历该数组,单独用一个文件类型的遍历pathStr记录把数组中的文件名的前缀替换成指定的前缀。
5、对数组中的元素进行判断,如果isDirectory(),再次调用本方法,形成递归,然后创建该目录,如果是文件,就调用复制文件copyFile方法
5、关闭资源

思路可能有点笨拙,希望大家给出自己最理想的方法

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马