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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package Test;

  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.FileReader;
  8. import java.io.FileWriter;
  9. import java.io.FilenameFilter;
  10. import java.io.IOException;
  11. import java.io.InputStreamReader;
  12. import java.io.OutputStreamWriter;

  13. public class Test2 {

  14.         public static void main(String[] args) throws IOException {
  15.                 File src = new File("D:\\A");
  16.                 File dest=new File("D:\\B");
  17.                
  18.                 copyDir(src,dest);
  19.         }
  20.        
  21.        
  22.         public static void copyDir(File src,File dest) throws IOException
  23.         {
  24.                 if(!dest.exists())
  25.                 {
  26.                         System.out.println("目录不存在,新建?");
  27.                         dest.mkdirs();
  28.                         File[] files=src.listFiles(new FilenameFilter() {
  29.                                
  30.                                 @Override
  31.                                 public boolean accept(File dir, String name) {
  32.                                         return name.endsWith(".java");

  33.                                 }
  34.                         });
  35.                        
  36.                         for(File file:files)
  37.                         {
  38.                                 if(file.isDirectory())
  39.                                 {
  40.                                         copyDir(new File(file.getAbsolutePath()), new File(dest.getAbsolutePath()+"\\"+file.getName()) );
  41.                                 }
  42.                                 else
  43.                                 {
  44.                                         copyFile(new File(file.getAbsolutePath()),new File(dest.getAbsolutePath()+"\\"+file.getName()));
  45.                                        
  46.                                 }
  47.                         }
  48.        
  49.                 }
  50.                 changeName(dest);
  51.         }


  52.         private static void copyFile(File src, File dest) throws IOException{

  53.                 BufferedReader bfr = new BufferedReader(new FileReader(src));

  54.                 BufferedWriter bfw = new BufferedWriter(new FileWriter(dest));

  55.                                 String str;
  56.                 while((str=bfr.readLine())!=null)
  57.                 {
  58.                         bfw.write(str);
  59.                 }

  60.                 bfr.close();
  61.                 bfw.flush();
  62.                 bfw.close();
  63.         }
  64.        
  65.        
  66.         private static void changeName(File dest) {
  67.                 File[] listFiles = dest.listFiles();
  68.                 for(File listFile:listFiles)
  69.                 {
  70.                         listFile.getAbsolutePath().replace(".java", ".txt");
  71.                 }
  72.         }

  73. }
  74.                
复制代码

评分

参与人数 1技术分 +2 收起 理由
杨佳名 + 2

查看全部评分

8 个回复

倒序浏览
本帖最后由 碎流 于 2015-1-14 16:33 编辑

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;

public class Demo10 {
        public static void main(String[] args) throws IOException {
        File src = new File("c:\\aaa");
        File dest=new File("e:\\aaa");
        
        copyDir(src,dest);
}


public static void copyDir(File src,File dest) throws IOException
{
        if(!dest.exists()) //新目录存在吗?  ..
        {
                System.out.println("目录不存在,新建?");
                dest.mkdirs();
        }
        if(src.exists() && src.isDirectory())  //旧目录是存在吗?是文件夹吗? 这个和上面属于同一个平面的.
        {
                   File[] files=src.listFiles();
                for(File file:files)  //遍历出来的又是两种情况.一个是文件一个是文件夹.
                {
                     if(file.isDirectory()) //如果是文件夹,递归.
                        {  
                                     copyDir(file, new File(dest.getPath()+"\\"+file.getName()));
                        }
                        else
                        {
                                //修改后缀在这里最好,因为这个接受的本来就是一个字符串,可以通过操作字符串很好解决.
                                copyFile(file,new File(dest.getPath()+"\\"+file.getName()));
                                
                        }
                }
        }
        changeName(dest);
}


private static void copyFile(File src, File dest) throws IOException{

        BufferedReader bfr = new BufferedReader(new FileReader(src));

        BufferedWriter bfw = new BufferedWriter(new FileWriter(dest));

                        String str = null;
        while((str=bfr.readLine())!=null)
        {
                bfw.write(str);
        }

        bfr.close();
        bfw.flush();
        bfw.close();
}

/*
* 后面没有修改了,自己想怎么解决.因为设置的名字是一个字符串,那么在命名的时候我们可以利用命名的字符串.
* 但是,你这样遍历出来的是一个一个文件,要文件名转成字符串才可以.所以,建议在以上进行迭代的过程中,就修改
* 名称.因为同样都是字符串.
*
* 按照你的思路,这样命名的话,最起码应该重新将文件夹进行遍历递归才可以.
* */

private static void changeName(File dest) {
        File[] listFiles = dest.listFiles();  //这个逻辑是错误的,因为复制的是一个文件夹,并且有层次的
        for(File listFile:listFiles)
        {
                listFile.getAbsolutePath().replace(".java", ".txt"); //这种修改名方法也是不可以的.只能修改后缀.
        }
        }
}

评分

参与人数 1技术分 +2 收起 理由
杨佳名 + 2

查看全部评分

回复 使用道具 举报 1 0
碎流 发表于 2015-1-14 16:26
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;

哦,在写入文件的时候改后缀我写的出来,有道面试题要求复制以后再改后缀该怎么写呢?重新遍历每级目录然后改名?还是怎么弄
回复 使用道具 举报
碎流 发表于 2015-1-14 16:26
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;

先感谢您的注释给我的提醒,现在的代码习惯存在问题,还有那个逻辑问题的提醒

http://bbs.itheima.com/thread-163983-1-1.html
这里我写好了复制方法本来想总结下在各个时间段来完成需要的功能。如果实现复制之后改后缀怎么实现比较简单呢?
回复 使用道具 举报
当我遇上你 发表于 2015-1-14 16:45
哦,在写入文件的时候改后缀我写的出来,有道面试题要求复制以后再改后缀该怎么写呢?重新遍历每级目录然 ...

如果你这个做法的话,还要递归,,,别人都是把所有的.java放入一个文件夹,然后遍历文件夹文件,再修改的.
回复 使用道具 举报
碎流 发表于 2015-1-14 16:51
如果你这个做法的话,还要递归,,,别人都是把所有的.java放入一个文件夹,然后遍历文件夹文件,再修改的. ...

哦,那这样子要实现复制完成后改后缀,最简短的代码应该就是在copyFile内部完成了,循环一次改写一次,这样子不存在多级目录
回复 使用道具 举报
看哥的吧 你们这些凡人颤抖吧
  1. /*
  2. * 1.编写一个程序,把一个目录里边的所有带.java文件拷贝到另一个目录中,拷贝成功后,
  3. * 把后缀名是.java的文件改为.txt文件。(要求有思路,有注释,有代码,需要注意的是:这个是先拷贝,拷贝成功后才可以改后缀名的)
  4. */
  5. import java.io.*;
  6. public class CopyDirs {

  7.         public static void main(String[] args) throws IOException {

  8.                 File f1 = new File("a");
  9.                 File f2 = new File("b");
  10.                 CD(f1,f2);
  11.                
  12.         }
  13.        
  14.         public static void CF(File f1,File f2) throws IOException
  15.         {
  16.                 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f1));
  17.                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f2));
  18.                 int len;
  19.                 byte[] buf = new byte[1024];
  20.                 while((len = bis.read(buf))!= -1)
  21.                 {
  22.                         bos.write(buf,0,len);
  23.                         bos.flush();
  24.                 }
  25.                 bis.close();
  26.                 bos.close();
  27.         }
  28.         public static void CD(File f1,File f2) throws IOException
  29.         {
  30.                 if(f1.isDirectory())
  31.                 {
  32.                         if(!f2.exists())
  33.                         {
  34.                                 f2.mkdir();
  35.                         }
  36.                 }
  37.                 File[] fs = f1.listFiles();
  38.                 for(File f: fs)
  39.                 {
  40.                         //需要注意的是:这个是先拷贝,拷贝成功后才可以改后缀名的
  41.                         if(f.isFile())
  42.                         {
  43.                                 if(f.getName().endsWith("java"))
  44.                                 {
  45.                                         String j = f.getName();
  46.                                         String[] n0 = j.split("\\.");
  47.                                         StringBuilder sb = new StringBuilder();
  48.                                         for(int i = 0;i < n0.length-1;i++)
  49.                                         {
  50.                                                 sb.append(n0[i]);
  51.                                         }
  52.                                         String j1 = sb.toString();
  53.                                         String jj = f2.getPath()+f.separator+j;
  54.                                         File fn =new File(jj);
  55.                                         CF(f,fn);
  56.                                        
  57.                                         String n = f2.getPath()+f.separator+j1+".txt";
  58.                                         File fn1 = new File(n);
  59.                                         fn.renameTo(fn1);
  60.                                 }
  61.                                 else
  62.                                 {
  63.                                         String j = f.getName();
  64.                                         String jj = f2.getPath()+f.separator+j;
  65.                                         File fn = new File(jj);
  66.                                         CF(f,fn);
  67.                                 }
  68.                         }
  69.                         if(f.isDirectory())
  70.                         {
  71.                                 String j = f.getName();
  72.                                 String jj = f2.getPath()+f.separator+j;
  73.                                 File fn = new File(jj);
  74.                                 CD(f,fn);
  75.                         }
  76.                 }
  77.         }
  78.        
  79. }
复制代码
回复 使用道具 举报
wangcongwu 发表于 2015-1-14 17:29
看哥的吧 你们这些凡人颤抖吧

这里还是么D
  1. public class Copy2 {

  2.         public static void main(String[] args) throws IOException {
  3.                 File src = new File("D:\\A");
  4.                 File dest=new File("D:\\B");
  5.                
  6.                 copyDir(src,dest);
  7.                 changeName(dest);
  8.         }
  9.        
  10.        
  11.         private static void changeName(File dest) {
  12.                 File[] listFiles = dest.listFiles();
  13.                
  14.                 for(File listfile:listFiles)
  15.                 {
  16.                        
  17.                         if(listfile.isDirectory())
  18.                         {
  19.                                 changeName(listfile);
  20.                         }
  21.                         else
  22.                         {
  23.                                 listfile.getPath().replace(".java", ".txt");
  24.                                 System.out.println(listfile.getName());
  25.                         }
  26.                        
  27.                        
  28.                 }
  29.         }
复制代码
怎么就没修改
回复 使用道具 举报
wangcongwu 发表于 2015-1-14 17:29
看哥的吧 你们这些凡人颤抖吧

兄台,我后来也写出来了,不过没你溜。不明白的是为什么renameTo成功了直接replace失败
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马