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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 光sail 中级黑马   /  2012-4-30 09:51  /  2755 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.yan.eight;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.io.UnsupportedEncodingException;

  10. /*
  11. * 用java IO实现:将一个目录下的文件copy到另一个目录下。
  12. * a) 输入:源目录,目标目录
  13. * b) 输出:文件及目录结构复制成功并打印复制的文件个数
  14. */

  15. public class FileCopy {
  16. private File file = null;
  17. private String sourceDir = null;
  18. private String signDir = null;
  19. private boolean flag = false;


  20. public static void main(String[] args) throws Exception {
  21. new FileCopy();
  22. }

  23. public FileCopy() throws Exception {
  24. inputSourceDir("D:\\360Rec");
  25. File[] files = file.listFiles();
  26. for (File f : files) {
  27. if (f.isFile()) System.out.println(f + "\t这是一个文件。");
  28. else if (f.isDirectory()) System.out.println(f + "\t这是一个目录。");
  29. }
  30. inputSignDir("D:\\aa");
  31. copyFile(files);
  32. }

  33. private void inputSourceDir(String files)throws Exception
  34. {
  35. flag = false;
  36. do {
  37. System.out.println("请输入源目录:");
  38. BufferedReader in = new BufferedReader(new InputStreamReader(
  39. new FileInputStream(files), "GBK"));


  40. try {
  41. sourceDir = in.readLine();
  42. file = new File(sourceDir);
  43. if (file.isDirectory()) {
  44. flag = true;
  45. } else {
  46. flag = false;
  47. }
  48. } catch (IOException e) {
  49. System.out.println("输入错误,请重新输入。");
  50. }
  51. } while (false == flag);
  52. }

  53. private void inputSignDir(String files) throws Exception {
  54. flag = false;
  55. do {
  56. System.out.println("请输入目标目录:");
  57. BufferedReader in = new BufferedReader(new InputStreamReader(
  58. new FileInputStream(files), "GBK"));
  59. try {
  60. signDir = in.readLine();
  61. file = new File(signDir);
  62. if (file.isDirectory()) {
  63. flag = true;
  64. } else {
  65. flag = false;
  66. }
  67. } catch (IOException e) {
  68. System.out.println("输入错误,请重新输入。");
  69. }
  70. } while (false == flag);
  71. }

  72. private void copyFile(File[] files) {
  73. System.out.println("拷贝的源文件夹路径:" + sourceDir);
  74. System.out.println("拷贝的目标文件夹路径:" + signDir);
  75. for (File f : files) {
  76. try {
  77. File ok = new File(signDir, f.getName());
  78. if (false == ok.exists()) {
  79. ok.createNewFile();
  80. }
  81. FileInputStream fis = new FileInputStream(f);
  82. byte[] size = new byte[(int) f.length()];
  83. fis.read(size);
  84. FileOutputStream fos = new FileOutputStream(ok);
  85. fos.write(size);
  86. if ((f.getName().equals(ok.getName())) && (f.length() == ok.length())) {
  87. System.out.println(f + "\t文件拷贝成功!");
  88. } else {
  89. System.out.println(f + "\t文件拷贝失败!");
  90. }
  91. fis.close();
  92. fos.close();
  93. } catch (FileNotFoundException e) {
  94. System.out.println("文件(夹)没有找到!");
  95. } catch (IOException e) {
  96. System.out.println("文件读取出错!");
  97. }
  98. }
  99. }
  100. }
复制代码
运行报出源文件夹拒绝访问异常
请输入源目录:
Exception in thread "main" java.io.FileNotFoundException: D:\360Rec (拒绝访问。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at com.yan.eight.FileCopy.inputSourceDir(FileCopy.java:45)
at com.yan.eight.FileCopy.<init>(FileCopy.java:29)
at com.yan.eight.FileCopy.main(FileCopy.java:25)
这是怎么回事

4 个回复

倒序浏览
应该是某些文件夹不允许访问子文件
添加判断,试试看有没有效果:


  1. public FileCopy() throws Exception {

  2.         inputSourceDir("D:\\360Rec");
  3.        
  4.         File[] files = file.listFiles();
  5.        
  6.         if(files != null) {                                //添加判断,文件是否可以访问,若文件不可访问,files会为null
  7.                 for (File f : files) {       
  8.                         if (f.isFile())
  9.                                 System.out.println(f + "\t这是一个文件。");       
  10.                         else if (f.isDirectory())
  11.                                 System.out.println(f + "\t这是一个目录。");       
  12.                 }
  13.                
  14.         inputSignDir("D:\\aa");       
  15.         copyFile(files);
  16.                 }
  17. }
复制代码
回复 使用道具 举报
刘基军 发表于 2012-4-30 10:26
应该是某些文件夹不允许访问子文件
添加判断,试试看有没有效果:

还是抛出之前异常,就没其他信息了
回复 使用道具 举报
呵呵,大意了吧,FileInputStream(String name)只能接受文件的名字,API里是这么说的:如果指定文件不存在,或者它是一个目录,而不是一个常规文件,抑或因为其他某些原因而无法打开进行读取,则抛出 FileNotFoundException。
回复 使用道具 举报
有可能文件夹下还有文件夹,我把你的代码改了改~参考一下~
  1. import java.io.*;
  2. /*
  3. * 用java IO实现:将一个目录下的文件copy到另一个目录下。
  4. * a) 输入:源目录,目标目录
  5. * b) 输出:文件及目录结构复制成功并打印复制的文件个数
  6. */

  7. public class FileCopy {
  8.         private File file = null;
  9.         private String sourceDirName = null;
  10.         private String signDirName = null;
  11.         private File srcFile = null;
  12.         private File signFile = null;
  13.         private boolean flag = false;
  14.         private int successCount = 0;
  15.         private int failCount = 0;

  16.         public static void main(String[] args) throws Exception {
  17.                 new FileCopy();
  18.         }

  19.         public FileCopy() throws Exception {
  20.                 inputSourceDir();
  21.                 inputSignDir();
  22.                 srcFile = new File(sourceDirName);
  23.                 signFile = new File(signDirName);
  24.                 System.out.println("源文件夹:" + srcFile.getAbsolutePath());
  25.                 System.out.println("目标文件夹:" + signFile.getAbsolutePath());
  26.                 System.out.println("--------------------------------------");
  27.                 copyFile(srcFile, signFile);
  28.                 System.out.println("--------------------------------------");
  29.                 System.out.println("拷贝完毕。复制文件成功" + successCount + "个,失败" + failCount + "个");
  30.         }

  31.         private void inputSourceDir() {
  32.                 flag = false;
  33.                 BufferedReader br = null;
  34.                 do {
  35.                         try {
  36.                                 System.out.println("请输入源目录:");
  37.                                 br = new BufferedReader(new InputStreamReader(System.in));
  38.                                 sourceDirName = br.readLine();
  39.                                 file = new File(sourceDirName);// 直接传目录名进来
  40.                                 if (file.isDirectory())
  41.                                         flag = true;
  42.                         } catch (IOException e) {
  43.                                 System.out.println("获取源目录失败!");
  44.                         }
  45.                 } while (false == flag);
  46.         }

  47.         // 读取目标目录只需判断是否为空,因为一个目录也有可能带后缀名
  48.         private void inputSignDir() {
  49.                 flag = false;
  50.                 BufferedReader br = null;
  51.                 do {
  52.                         System.out.println("请输入目标目录:");
  53.                         br = new BufferedReader(new InputStreamReader(System.in));
  54.                         try {
  55.                                 signDirName = br.readLine();
  56.                                 if (!"".equals(signDirName)) {
  57.                                         file = new File(signDirName);
  58.                                         if (file.exists() || file.mkdir()) // 这么判断应该没错吧
  59.                                                 flag = true;
  60.                                 }
  61.                         } catch (IOException e) {
  62.                                 System.out.println("获取目标目录失败!");
  63.                         }
  64.                 } while (false == flag);
  65.         }

  66.         private void copyFile(File sourceFile, File signFile) {
  67.                 // 若存在多级目录,进行递归
  68.                 FileInputStream fis = null;
  69.                 FileOutputStream fos = null;
  70.                 File[] files = sourceFile.listFiles();
  71.                 String resultStr = null;
  72.                 for (File f : files) {
  73.                         try {
  74.                                 File ok = new File(signFile, f.getName());
  75.                                 if (f.isDirectory())
  76.                                 {
  77.                                         if (!ok.exists())
  78.                                         {
  79.                                                 if (ok.mkdir())
  80.                                                         resultStr = "创建目录" + f.getAbsolutePath() + "成功";
  81.                                         }
  82.                                         else
  83.                                         {
  84.                                                 resultStr = "目录" + f.getAbsolutePath() + "已存在";
  85.                                         }
  86.                                         System.out.println(resultStr);
  87.                                         copyFile(f, ok);
  88.                                 }
  89.                                 else
  90.                                 {
  91.                                         resultStr = "拷贝文件" + f.getAbsolutePath() + "...";
  92.                                         if (!ok.exists())
  93.                                                 ok.createNewFile();
  94.                                         fis = new FileInputStream(f);
  95.                                         fos = new FileOutputStream(ok);
  96.                                         byte[] size = new byte[1024]; //文件可能过大,定义一个1K的数组循环读
  97.                                         int len = 0;
  98.                                         while ((len = fis.read(size)) != -1) {
  99.                                                 fos.write(size, 0, len);
  100.                                                 fos.flush();
  101.                                         }
  102.                                         if ((f.getName().equals(ok.getName()))
  103.                                                         && (f.length() == ok.length()))
  104.                                         {
  105.                                                 resultStr = resultStr + "成功!";
  106.                                                 successCount++;
  107.                                         }
  108.                                         else
  109.                                         {
  110.                                                 resultStr = resultStr + "失败!";
  111.                                                 failCount++;
  112.                                         }
  113.                                         System.out.println(resultStr);
  114.                                 }
  115.                         } catch (FileNotFoundException e) {
  116.                                 System.out.println("文件(夹)没有找到!");
  117.                         } catch (IOException e) {
  118.                                 System.out.println("文件读取出错!");
  119.                         }
  120.                         finally
  121.                         {
  122.                                 if (fis != null)
  123.                                 {
  124.                                         try {
  125.                                                 fis.close();
  126.                                         } catch (IOException e) {
  127.                                                 e.printStackTrace();
  128.                                         }
  129.                                 }
  130.                                 if (fos != null)
  131.                                 {
  132.                                         try {
  133.                                                 fos.close();
  134.                                         } catch (IOException e) {
  135.                                                 e.printStackTrace();
  136.                                         }
  137.                                 }
  138.                         }
  139.                 }
  140.         }

  141. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
贠(yun)靖 + 2 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马