黑马程序员技术交流社区

标题: 复制一个目录中所有java文件到另一个目录中 [打印本页]

作者: 王月    时间: 2012-7-17 18:02
标题: 复制一个目录中所有java文件到另一个目录中
本帖最后由 王月 于 2012-7-18 23:27 编辑

public class CopyFileTest {

        /**
         * 需求: 找出d盘下所有的 .java 文件,拷贝至 c:\jad 目录下。
         *
         * 思路:
         *  1,递归指定的目录
         * 2,递归过程中对文件指定指定条件的判断
         * 3,将符合条件的文件存储进list集合
         * 4,将改变类型的文件写入到另一个指定目录中
         * @throws IOException
         * @throws  
         * @throws IOException
         */
        public static void main(String[] args) throws IOException  {

                File dir = new File("d:\\");

                List<File> list = new ArrayList<File>();

                listDir(dir, list);
               
                File destFile=new File("c:\\jad");
               
                write2File(destFile,list);

        }


        public static void listDir(File dir, List<File> list) {

                File[] files = dir.listFiles();

                for (File file : files) {
                        //如果是目录则递归
                        if (file.isDirectory()) {
                                listDir(file, list);
                        } else {
                                //是文件则判断是否符合条件,符合则存入集合中
                                if (file.getName().endsWith(".java")) {
                                       
                                        list.add(file);
                                }
                        }
                }

        }
        private static void write2File(File destFile, List<File> list) throws IOException {
               
                BufferedInputStream bufin=null;
                BufferedOutputStream bufout=null;
                byte[] by=new byte[1024];
               
                int len=0;
                try {
                        
                         for(File file : list)
                         {
                                 bufin=new BufferedInputStream(new FileInputStream(file));
                                 bufout=new BufferedOutputStream(new FileOutputStream(destFile));
                                 
                                 while((len=bufin.read(by))!=-1){
                                                 bufout.write(by,0,len);
                                                 bufout.flush();
                                 }
                         }
                } catch (FileNotFoundException e) {
                        
                        e.printStackTrace();
                }finally{
                        try{
                                if(bufout!=null)
                                {
                                bufout.close();
                                }
                                if(bufin!=null)
                                {
                                bufin.close();
                                }
                   }catch(IOException e){
                           e.printStackTrace();
                   }
                   }
                }
}


运行出现空指针异常,不知道怎么回事。(提示说是在listDir()中,for循环和递归那里出现的问题)




作者: 李伟    时间: 2012-7-17 18:11
public static void listDir(File dir, List<File> list) {

                File[] files = dir.listFiles();

                for (File file : files) {
                        //如果是目录则递归
                     if(file.isHidden)
                                       continue;
//您的D盘有隐藏文件,应该加上这段代码        
              if (file.isDirectory()) {
                                listDir(file, list);
                        } else {
                                //是文件则判断是否符合条件,符合则存入集合中
                                if (file.getName().endsWith(".java")) {
                                       
                                        list.add(file);
                                }
                        }
                }

        }

作者: 李伟    时间: 2012-7-17 18:12
if(file.isHidden())
    continue;

作者: 王月    时间: 2012-7-17 18:23
谢谢,刚试一下,又有新问题了
拒绝访问怎么回事啊

java.io.FileNotFoundException: c:\jad template.java (拒绝访问。)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:104)
        at test5.CopyFileTest.write2File(CopyFileTest.java:77)
        at test5.CopyFileTest.main(CopyFileTest.java:38)

作者: 黑马刘涛    时间: 2012-7-17 18:35
  1. public static void listDir(File dir, List<File> list) {

  2.                 File[] files = dir.listFiles();

  3.                 for (File file : files) {
  4.                         //如果是目录则递归
  5.                     if(file != null)
  6.                              {
  7.                         if (file.isDirectory()) {
  8.                                 listDir(file, list);
  9.                         } else {
  10.                                 //是文件则判断是否符合条件,符合则存入集合中
  11.                                 if (file.getName().endsWith(".java")) {
  12.                                        
  13.                                         list.add(file);
  14.                                 }
  15.                         }
  16.                 }
  17. }

  18.         }
复制代码
就好了
作者: 黑马刘涛    时间: 2012-7-17 18:36
楼主搜索帖子。
作者: 高原    时间: 2012-7-17 18:37
这是……入学考试题啊!
作者: 李伟    时间: 2012-7-17 18:59
while((len=bufin.read(by))!=-1)//应该是while((len=bufin.read(by))!=0)
{
        bufout.write(by,0,len);
         bufout.flush();

作者: 任文杰    时间: 2012-7-18 18:58
      最近一直很忙,昨天晚上看到了这个小需求,想了想,思路有点模糊。今天中午利用了一个多小时的时间,实现了楼主想要的效果。具体代码如下:
  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  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.util.ArrayList;
  9. import java.util.List;
  10. import java.util.concurrent.CopyOnWriteArrayList;

  11. public class CopyFileDemo {
  12.         static CopyOnWriteArrayList<File> directoryFiles = new CopyOnWriteArrayList<File>(); //存储有目录的文件,这里我用了线程并发列表,目的是实现在添加数据的过程中,可以删除列表中的数据。
  13.         static List<File> javaFiles = new ArrayList<File>();//存储所有的Java文件。

  14.         public static void main(String[] args) {
  15.                 File orginalFile = new File("d:/Program Files/");
  16.                 File destFile = new File("e:/jad/java2");
  17.                 getJavaFiles(orginalFile);

  18.                 while (directoryFiles.size() > 0) {
  19.                         getJavaFiles(directoryFiles.remove(0));
  20.                 }
  21.                 // copy2SpecifiedFile
  22.                 copy2SpecifiedFolder(destFile);
  23.         }

  24.         private static void getJavaFiles(File orginalFile) {
  25.                 if (orginalFile.isDirectory()) {
  26.                         File[] files = orginalFile.listFiles();

  27.                         if (files != null && files.length > 0) {
  28.                                 for (File file : files) {
  29.                                         if (file.isDirectory()) {
  30.                                                 directoryFiles.add(file);
  31.                                         } else {
  32.                                                 addJavaFileToContainer(file);
  33.                                         }
  34.                                 }
  35.                         } else {
  36.                                 System.out
  37.                                                 .println(orginalFile.getAbsolutePath() + " 目录下没有任何文件");
  38.                         }
  39.                 } else {
  40.                         addJavaFileToContainer(orginalFile);
  41.                 }
  42.         }

  43.         private static void addJavaFileToContainer(File file) {
  44.                 if (file.getName().endsWith(".java")) {
  45.                         javaFiles.add(file);
  46.                 }
  47.         }

  48.         private static void copy2SpecifiedFolder(File destFile) {
  49.                 BufferedInputStream bis = null;
  50.                 BufferedOutputStream bos = null;
  51.                 int len = 0;
  52.                 byte[] buffer = new byte[1024];
  53.                 try {
  54.                         for (File file : javaFiles) {
  55.                                 bis = new BufferedInputStream(new FileInputStream(file));
  56.                                 bos = new BufferedOutputStream(new FileOutputStream(new File(
  57.                                                 destFile.getAbsolutePath() + File.separator
  58.                                                                 + file.getName())));
  59.                                 while ((len = bis.read(buffer)) != -1) {
  60.                                         bos.write(buffer, 0, len);
  61.                                         bos.flush();
  62.                                 }
  63.                         }
  64.                 } catch (FileNotFoundException e) {
  65.                         e.printStackTrace();
  66.                 } catch (IOException e) {
  67.                         e.printStackTrace();
  68.                 } finally {
  69.                         if (bis != null) {
  70.                                 try {
  71.                                         bis.close();
  72.                                         bis = null;
  73.                                 } catch (IOException e) {
  74.                                         e.printStackTrace();
  75.                                 }
  76.                         }

  77.                         if (bos != null) {
  78.                                 try {
  79.                                         bos.close();
  80.                                         bos = null;
  81.                                 } catch (IOException e) {
  82.                                         e.printStackTrace();
  83.                                 }
  84.                         }
  85.                 }
  86.         }
  87. }
复制代码
此段代码实现了将当前目录及其子目录中所有Java文件拷贝到指定的目标路径。此代码,还有待完善,不过基本上实现了楼主想要的效果。也请各位高手提出宝贵意见,谢谢!
作者: 王月    时间: 2012-7-18 23:26
RWJ2012 发表于 2012-7-18 18:58
最近一直很忙,昨天晚上看到了这个小需求,想了想,思路有点模糊。今天中午利用了一个多小时的时间, ...

呵呵,谢了
作者: 黑马罗坚    时间: 2012-7-18 23:35
这好像是入学测试题中的一提把




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2