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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Whero 中级黑马   /  2014-12-4 20:18  /  1886 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;

  5. /*
  6. * 需求:拷贝一个目录中后缀为.java的文件,遍历拷贝的这个目录,并将该目录下所有后缀为.java的文件改为后缀为.txt
  7. * */

  8. public class ErgodicFile {
  9.        
  10.         public static void main(String[] args)throws IOException
  11.         {
  12.                 File destDir=new File("C:/JAVA1");
  13.                 File srcDir=new File("C:/JAVA");
  14.                 destDir.mkdir();
  15.                 copyDir(srcDir,destDir);
  16.                 Ergodic(destDir);
  17.                
  18.         }

  19.         public static void Ergodic(File dir)
  20.         {
  21.                 File[] files = dir.listFiles();
  22.                 for (File file : files) {
  23.                         if (file.isDirectory())
  24.                                 Ergodic(file);
  25.                         else {
  26.                                 int index = file.getAbsolutePath().indexOf(".java");
  27.                                 if (index != -1) {
  28.                                         String AbsPath = file.getAbsolutePath().substring(0, index) + ".txt";
  29.                                         File dest = new File(AbsPath);
  30.                                         file.renameTo(dest);
  31.                                 }
  32.                         }
  33.                 }
  34.         }
  35.        
  36.         public static void copyDir(File srcDir,File destDir) throws IOException
  37.         {
  38.                 File files[]=srcDir.listFiles();
  39.                 for(File file:files)
  40.                 {
  41.                         if(file.isDirectory()&&file.listFiles().length!=0){
  42.                                 File f=new File(destDir.getAbsolutePath()+File.separator+file.getName());
  43.                                 f.mkdir();
  44.                                 copyDir(file,f);
  45.                         }
  46.                         else
  47.                         {
  48.                                 if(!isEndWithJava(file))
  49.                                         continue ;
  50.                                 File f=new File(destDir.getPath()+File.separator+file.getName());
  51.                                 if(!f.exists())
  52.                                         f.createNewFile();
  53.                                 copyFile(file,f);
  54.                         }
  55.                 }
  56.         }
  57.        
  58.         public static void copyFile(File src,File dest) throws IOException
  59.         {
  60.                 FileInputStream fin=new FileInputStream(src);
  61.                 FileOutputStream fos=new FileOutputStream(dest);
  62.                
  63.                 byte[] b=new byte[1024];
  64.                 int len;
  65.                 while((len=fin.read(b))!=-1)
  66.                 {
  67.                         fos.write(b,0,len);
  68.                 }
  69.                 fos.close();
  70.                 fin.close();
  71.         }
  72.        
  73.         private static boolean isEndWithJava(File file)
  74.         {
  75.                 return file.getName().endsWith(".java");
  76.         }
  77. }
复制代码

评分

参与人数 1黑马币 +3 收起 理由
杨佳名 + 3

查看全部评分

12 个回复

正序浏览
Whero 中级黑马 2014-12-5 17:44:19
13#
HelloWorld! 发表于 2014-12-5 14:20
搞了半天才弄明白,按楼主的思路整理了下,楼主在获取.java在文件名中的索引时,应该用LastIndexOf( );因为 ...

恩恩,应该是lastIndexOf( ),谢谢哈
回复 使用道具 举报
Whero 中级黑马 2014-12-5 17:42:21
12#
as604049322 发表于 2014-12-5 15:52
个人认为在复制文件完成就立刻改名的效率比全部复制完重新遍历改名的效率高点。
...

恩恩,当时功能都分开编了,没想到呢,谢谢
回复 使用道具 举报 1 0
个人认为在复制文件完成就立刻改名的效率比全部复制完重新遍历改名的效率高点。
  1. public static void copyFile(File src,File dest) throws IOException
  2.         {
  3.                 FileInputStream fin=new FileInputStream(src);
  4.                 FileOutputStream fos=new FileOutputStream(dest);
  5.                
  6.                 byte[] b=new byte[1024];
  7.                 int len;
  8.                 while((len=fin.read(b))!=-1){
  9.                                         fos.write(b,0,len);
  10.                 }
  11.                 fos.close();
  12.                 fin.close();
  13.                                
  14.                                 int index = dest.getAbsolutePath().indexOf(".java");
  15.                 if (index != -1)
  16.                                         dest.renameTo(new File(dest.getAbsolutePath().substring(0, index) + ".txt"));
  17.         }
复制代码
回复 使用道具 举报 1 0
搞了半天才弄明白,按楼主的思路整理了下,楼主在获取.java在文件名中的索引时,应该用LastIndexOf( );因为.java文件中可能有多个.java,比如:a.java.java。谢谢楼主分享!
  1. import java.io.File;
  2. import java.io.FileReader;
  3. import java.io.FileWriter;
  4. import java.io.IOException;

  5. /*
  6. * 需求:拷贝一个目录中后缀为.java的文件,遍历拷贝的这个目录,并将该目录下所有后缀为.java的文件改为后缀为.txt
  7. *
  8. * 思路:将源文件夹和目的文件夹封装成对象。遍历源文件中所有文件,如果是文件夹则在目的文件中创建同名文件夹,如果不是文件夹,则
  9. * 判断是否是.java文件,如果是,则将此文件复制到对应的目的文件夹中
  10. *
  11. * 步骤:
  12. * 1、将源文件夹和目的文件夹封装成对象,创建目的文件夹。
  13. * 2、将源文件中的.java文件复制到目的文件夹中,注意目的文件夹中的.java文件相对路径和源文件夹保持一致
  14. * 3、遍历目的文件夹,将.java文件的后缀名修改为.txt。注意.java文件名的特殊情况:如a.java.java
  15. */
  16. public class Test1 {
  17.        
  18.         public static void main(String[] args) throws IOException {
  19.                 File srcDir = new File("c:\\JAVA");// 将源文件封装成对象
  20.                 File desDir = new File("c:\\JAVA1");// 将目的文件封装成对象
  21.                 desDir.mkdir();// 创建目的文件夹
  22.                 copyFiles(srcDir, desDir);// 将.java文件复制到目的文件夹
  23.                 iterateChangeSuffix(desDir);// 遍历目的文件夹中的.java文件,并将其后缀修改为.txt
  24.                
  25.         }

  26.         // 定义将源文件夹中的.java文件复制到目的文件夹中的方法
  27.         public static void copyFiles(File srcDir, File desDir) throws IOException {
  28.                 // 遍历源文件夹中的文件
  29.                 File[] files = srcDir.listFiles();
  30.                 for (File file : files) {
  31.                         // 如果是文件夹并且不为空
  32.                         if (file.isDirectory() && file.listFiles().length != 0) {
  33.                                 // 将此文件夹封装成对象,在对应的源文件夹中创建同名文件夹
  34.                                 File f = new File(desDir.getAbsolutePath() + File.separator
  35.                                                 + file.getName());
  36.                                 f.mkdir();
  37.                                 // 递归,将源文件夹中的文件夹复制到对应的目的文件夹
  38.                                 copyFiles(file, f);
  39.                         }
  40.                         // 如果不是文件夹,获取.java文件
  41.                         else {
  42.                                 // 如果不是.java文件,跳出当前循环,继续下一次循环
  43.                                 if (!file.getName().endsWith(".java"))
  44.                                         continue;
  45.                                 // 如果是.java文件,则在对应的目的文件夹中创建同名文件
  46.                                 File f = new File(desDir.getPath() + File.separator
  47.                                                 + file.getName());
  48.                                 f.createNewFile();
  49.                                 // 将.java文件复制到对应的目的文件夹中的同名文件中
  50.                                 copyFile(file, f);
  51.                         }
  52.                 }
  53.         }

  54.         // 定义复制文件的方法
  55.         public static void copyFile(File file, File f) throws IOException {
  56.                 FileReader fr = new FileReader(file);
  57.                 FileWriter fw = new FileWriter(f);
  58.                 int ch = 0;
  59.                 while ((ch = fr.read()) != -1) {
  60.                         fw.write(ch);
  61.                         fw.close();
  62.                 }
  63.                 fr.close();
  64.                 fw.close();
  65.         }

  66.         // 对目的文件夹中.java文件进行遍历,并将其后缀名改为.txt
  67.         public static void iterateChangeSuffix(File f) {
  68.                 File[] files = f.listFiles();
  69.                 for (File file : files) {
  70.                         // 如果是文件夹,递归遍历
  71.                         if (file.isDirectory())
  72.                                 iterateChangeSuffix(file);
  73.                         // 如果是.java文件,对文件的绝对路径字符串反向查找子串".java"的索引
  74.                         int len = file.getAbsolutePath().lastIndexOf(".java");
  75.                         if (len != -1) {
  76.                                 // 将.java文件名后缀修改为.txt,并封装成文件对象
  77.                                 File desFile = new File((file.getAbsolutePath().substring(0,
  78.                                                 len) + ".txt"));
  79.                                 // 将文件重命名
  80.                                 file.renameTo(desFile);
  81.                         }
  82.                 }
  83.         }
  84. }
复制代码
回复 使用道具 举报
Whero 中级黑马 2014-12-5 10:39:58
9#
HelloWorld! 发表于 2014-12-5 10:35
题意感觉有点模糊,是不是这样:一个目录中有一些文件和文件夹,文件夹中还有文件夹和文件,目录中有一部分 ...

嗯哪,差不多就是这个意思,不过就是“.java”文件的相对位置不变
回复 使用道具 举报
题意感觉有点模糊,是不是这样:一个目录中有一些文件和文件夹,文件夹中还有文件夹和文件,目录中有一部分文件是.java文件,把目录中所有的.java文件复制到一个新的文件夹中,然后将新文件夹中的.java文件修改为.txt文件。
回复 使用道具 举报
好难啊 。。
回复 使用道具 举报
厉害啊!
回复 使用道具 举报
感谢楼主分享
回复 使用道具 举报
谢谢分享~~~
回复 使用道具 举报
{:3_55:}
建议加点注释会好些,不然看着让人有点累。
回复 使用道具 举报
厉害~~点个赞

评分

参与人数 1黑马币 +3 收起 理由
曾翀 + 3 淡定

查看全部评分

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