黑马程序员技术交流社区

标题: 【思路交流】将指定目录下所有.java文件拷贝到另一个目的... [打印本页]

作者: 李春丽    时间: 2014-9-12 17:24
标题: 【思路交流】将指定目录下所有.java文件拷贝到另一个目的...
本帖最后由 李春丽 于 2014-9-15 18:50 编辑
  1. import java.io.*;
  2. import java.util.*;
  3. public class Test9
  4. {
  5.         public static void main(String[] args)throws IOException
  6.         {
  7.                 /*
  8.                 思路:1,对指定目录进行递归。
  9.                           2,获取递归过程中的所有java文件,并将这些路径存储到集合中。
  10.                           3,按集合中存储的目录,将文件关联到文件读取流对象,并添加到Vector集合中。
  11.                           4,将集合中的io流合并。
  12.                           5,输出流 写入目标文件中。
  13.                 */
  14.                 File dir = new File("c:\\example");
  15.                 List<File> list = new ArrayList<File>();
  16.                 fileToList(dir,list);//目录存放到list集合中。
  17.                                 
  18.                 //只有vector集合中有Enumeration。
  19.                 Vector<FileInputStream> v = new Vector<FileInputStream>();
  20.                 //添加流对象。到集合中。
  21.                 for(File f : list)
  22.                 {
  23.                         String path = f.getAbsolutePath();
  24.                         v.add(new FileInputStream(path));
  25.                 }

  26.                 /* Enumeration<E> elements()返回此向量的组件的枚举。*/
  27.                 Enumeration<FileInputStream> en = v.elements();
  28.                 //序列流:将多个io流合并成一个io流。
  29.                 SequenceInputStream sis = new SequenceInputStream(en);

  30.                 //建立一个写字节流,关联4.txt目的文件。
  31.                 FileOutputStream fos = new FileOutputStream("c:\\aaa.txt");
  32.                
  33.                 //源和目的的读写动作。
  34.                 //创建一个缓冲区
  35.                 byte[] buf = new byte[1024];
  36.                 int len = 0;
  37.                 while((len=sis.read(buf))!=-1)
  38.                 {
  39.                         fos.write(buf,0,len);
  40.                 }

  41.                 fos.close();
  42.                 sis.close();               
  43.         }
  44.         
  45.         //查找目录中的 .java 文件。
  46.         public static void fileToList(File dir,List<File> list)
  47.         {
  48.                 //获取所有文件列表
  49.                 File[] files = dir.listFiles();
  50.                 for(File file : files)
  51.                 {
  52.                         //是文件夹,递归
  53.                         if(file.isDirectory())
  54.                                 fileToList(file,list);
  55.                         else
  56.                         {        //不是文件夹,判断是否是java文件,添加到集合。
  57.                                 if(file.getName().endsWith(".java"))
  58.                                         list.add(file);
  59.                         }
  60.                 }
  61.         }
  62. }
复制代码


这是我的思路,还有更简单的做法吗?或者其他思路?
交流交流!
:handshake

作者: 李春丽    时间: 2014-9-15 18:51
本帖最后由 李春丽 于 2014-9-15 18:53 编辑

求思路!各位的解题思路。求更简!!!
作者: 舍我其谁    时间: 2014-9-15 19:11
我的思路是:  对指定目录进行遍历,是文件夹就递归,是文件就判断是否是 .java文件 是就开始读写 不是就继续遍历
作者: 李春丽    时间: 2014-9-15 23:07
舍我其谁 发表于 2014-9-15 19:11
我的思路是:  对指定目录进行遍历,是文件夹就递归,是文件就判断是否是 .java文件 是就开始读写 不是就继 ...

读写的实现过程?讲讲细节呗,效率较高的方法。
作者: 谢建平    时间: 2014-9-16 03:15
他是说在遍历源文件时 就边复制 , 如果查到是一个文件就复制一个文件 ,查到是一个文件夹就建一个文件夹
作者: 李春丽    时间: 2014-9-16 09:34
本帖最后由 李春丽 于 2014-9-16 09:36 编辑
复制代码
放在自己的楼楼里,仔细研究研究。
  1. import java.io.File;
  2. import java.io.FileFilter;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;

  9. /**
  10. * 9、 编写程序,将指定目录下所有.java文件拷贝到另一个目的中,并将扩展名改为.txt
  11. * @author liuxuanchao
  12. *
  13. */
  14. public class Test9 {
  15.          public static void main(String[] args) throws IOException{
  16.                  
  17.                 getCopy("F:\\JAVAheima", "F:\\heima");
  18.          
  19.         }
  20.          
  21.         public static void getCopy(String yuan,String md) throws IOException{
  22.                  //指定一个源的目录
  23.                  File file1 = new File(yuan);
  24.                  //指定目的的目录
  25.                  File file2 = new File(md);
  26.                  //创建目录
  27.                  file2.mkdir();
  28.                  //获得源目录下的所有java文件路径。
  29.                  OutputStream ops = null;
  30.                  InputStream ips = null ;
  31.                  //建立输出流
  32.                  File[] JAVA = file1.listFiles(new FileFilter() {
  33.                         
  34.                         @Override
  35.                          public boolean accept(File pathname) {
  36.                                  // TODO Auto-generated method stub
  37.                                  return pathname.getName().endsWith(".java");
  38.                          }
  39.                  });
  40.                  //遍历所有的java文件路径
  41.                  for(File Pathname : JAVA){
  42.                          int index1 = Pathname.getName().lastIndexOf('\\');
  43.                          int index2 =  Pathname.getName().lastIndexOf('.');
  44.                          String name = Pathname.getName().substring(index1+1, index2)+".txt";
  45.                          //获取的路径下的文件名字,把java改成txt。
  46.                          try {//每遍历到一个就读取一个
  47.                                  ips = new FileInputStream(Pathname);
  48.                                  //建立一个缓冲区
  49.                                  byte[] buf = new byte[1024];
  50.                                  
  51.                                 int len = 0;
  52.                                  while((len = ips.read(buf))!=-1){
  53.                                          //把读到的java文件全部输出到了指定的目录下+该该修改过的名字。
  54.                                          ops = new FileOutputStream(file2+"\\"+name);
  55.                                          ops.write(buf);
  56.                                         ops.flush();
  57.                                          //将读取到的数据打印到控制台,调试用的
  58.                                          //System.out.println(new String(buf,0,len));
  59.                                  }
  60.                                  
  61.                         } catch (FileNotFoundException e) {
  62.                                  // TODO Auto-generated catch block
  63.                                  e.printStackTrace();
  64.                          }
  65.                  }
  66.                  //把文件转过去了,下面我们去修改目的下的文件名,将.java修改成.txt。
  67.                  File[] TXT = file2.listFiles(new FileFilter() {
  68.                          //先读取到了目的目录下所有文件的路径返回一个File数组
  69.                          @Override
  70.                          public boolean accept(File pathname) {
  71.                                  // TODO Auto-generated method stub
  72.                                  return pathname.getName().endsWith(".java");
  73.                          }
  74.                  });
  75.                  //遍历路径
  76.                  for(File Pathname : TXT){
  77.                          //把每个文件的名字都重命名一下将.java改成.txt
  78.                          Pathname.renameTo(new File(file2.toString()+
  79.                                          Pathname.getName().replace(".java", ".txt")));
  80.                  }
  81.                  //关闭资源。
  82.                  ips.close();
  83.                  ops.close();               
  84.         }
  85. }
复制代码







作者: MeryStyle    时间: 2014-9-16 12:43
思路都差不多,给你提个小建议吧:你要复制的是JAVA文件也就是文本文件,可以考虑使用Writer,Reader体系下的Filewriter和FileReader对象,要提高效率,可以使用缓冲区BufferedReader,BufferedWriter装饰一下。
作者: clh    时间: 2014-9-16 13:08
我觉得类似题目其实不用对子文件夹进行迭代遍历的,他说的是指定目录下的。java文件,当开始迭代是,目录都不一样了,
作者: Fightin黑马    时间: 2014-9-16 22:22
本帖最后由 Fightin黑马 于 2014-9-16 22:26 编辑

贴一下自己做的代码吧;

  1. import java.io.*;
  2. import java.util.Scanner;

  3. public class Copy {
  4.         public static void main(String[] args) throws IOException{
  5.                 System.out.println("请输入要复制的文件夹路径");
  6.                 File start= getFile();
  7.                 System.out.println("请输入目标文件夹路径");
  8.                 File dest= getFile();
  9.                 startCopy(start,dest);
  10.                 System.out.println("复制完成");
  11.         }
  12.         //获取文件夹的方法
  13.         public static File getFile(){                                                                                                                                                                       
  14.                 Scanner sc= new Scanner(System.in);
  15.                 while (true) {
  16.                         String line = sc.nextLine();
  17.                         File file = new File(line);
  18.                         if (file.exists()) {
  19.                                 if (file.isDirectory()) {
  20.                                         return file;
  21.                                        
  22.                                 } else if (file.isFile()) {
  23.                                         System.out.println("您输入的是一个文件路径,请输入一个文件夹路径");
  24.                                 }
  25.                         } else {
  26.                                 System.out.println("您输入的文件夹路径不存在,请重新输入一个文件夹路径");
  27.                         }
  28.                 }
  29.         }
  30.        

  31.         private static void startCopy(File start, File dest) throws IOException {
  32.                 File file= new File(dest,start.getName());
  33.                 file.mkdir();
  34.                 File[] arr= start.listFiles();
  35.                 for (File file2 : arr) {
  36.                         if(file2.isDirectory()){
  37.                                 startCopy(file2,file);
  38.                         }else{
  39.                                 copy(file,file2);
  40.                         }
  41.                 }
  42.         }
  43. //复制文件的方法
  44.         private static void copy(File file,File file2) throws IOException {

  45.                 BufferedInputStream bis= new BufferedInputStream(new FileInputStream(file2));
  46.                 BufferedOutputStream bos= new BufferedOutputStream(new FileOutputStream(new File(file,file2.getName())));
  47.                 int len;
  48.                 while((len=bis.read())!=-1){
  49.                         bos.write(len);
  50.                 }
  51.                 bis.close();
  52.                 bos.close();
  53.                
  54.         }
  55. }
复制代码


作者: 李春丽    时间: 2014-9-17 09:15
MeryStyle 发表于 2014-9-16 12:43
思路都差不多,给你提个小建议吧:你要复制的是JAVA文件也就是文本文件,可以考虑使用Writer,Reader体系下 ...

O(∩_∩)O谢谢:lol
作者: 李春丽    时间: 2014-9-17 09:16
clh 发表于 2014-9-16 13:08
我觉得类似题目其实不用对子文件夹进行迭代遍历的,他说的是指定目录下的。java文件,当开始迭代是,目录都 ...

如果指定的目录包含子目录呢?也要考虑到这种情况吧。:P
作者: 李春丽    时间: 2014-9-17 09:21
Fightin黑马 发表于 2014-9-16 22:22
贴一下自己做的代码吧;

谢谢分享~~~




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