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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王晓明 于 2013-1-25 12:00 编辑

这道题的题目在代码里有,鄙人做法如下:
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;

  5. /*9、 编写一个程序,将d:\java 目录下的所有.java 文件
  6. * 复制到d:\jad 目录下,
  7. * 并将原来文件的扩展名从.java 改为.jad。
  8. */
  9. public class Test9 {
  10.         public static void main(String[] args) throws IOException {
  11.                 //指定目标文件
  12.                 File srcFile=new File("d:\\java");
  13.                 //指定目的路径
  14.                 File destFile = new File("d:\\jad");
  15.                
  16.                 File[] files = srcFile.listFiles();
  17.                 for(File f:files){
  18.                         if(f.isFile()){
  19.                                 String name = f.getName();
  20.                                 if(name.endsWith(".java")){
  21.                                         //创建输入流。并关联目标文件
  22.                                         FileInputStream fis = new FileInputStream(f);
  23.                                         //创建输出流,关联输出目录
  24.                                         FileOutputStream fos = new FileOutputStream(new File(destFile,name));
  25.                                         //调用缓冲数组,为了提高效率,使用1024*1024的数组
  26.                                         byte[] byt=new byte[1024*1024];
  27.                                         //定义一个变量接受数组数据
  28.                                         int len=0;
  29.                                         while((len=fis.read(byt))!=-1){
  30.                                                 fos.write(byt, 0, len);
  31.                                         }
  32.                                         //抽取文件名后缀名的角标
  33.                                         int lastIndexOf = name.lastIndexOf(".java");
  34.                                         //抽取文件名中非后缀名的子字符串
  35.                                         String substring = name.substring(0, lastIndexOf);
  36.                                         //将子字符串和.jad组合成新文件名
  37.                                         String newname = substring.concat(".jad");
  38.                                         //以新文件名在源目录创建新空白文件
  39.                                         File file2 = new File(srcFile,newname);
  40.                                         fis=new FileInputStream(f);
  41.                                         fos=new FileOutputStream(file2);
  42.                                         while((len=fis.read(byt))!=-1){
  43.                                                 fos.write(byt, 0, len);
  44.                                         }
  45.                                         //删除源目录里的java文件
  46. //                                        System.out.println(f.delete());
  47.                                         f.delete();
  48.                                         //关闭流!
  49.                                         fis.close();
  50.                                         fos.close();
  51.                                 }
  52.                         }
  53.                 }
  54.                
  55.         }
  56. }
复制代码
我的已经做到拷贝java文件已经生成jad文件,但是在这后一步“f.delete();”的时候无法删除原目录里的java文件,而且原目录里jad文件已经生成了,验证的时候打印  System.out.println(f.delete()); 也是false!这个题已经困惑我许久了,真心求高手解惑!

评分

参与人数 1技术分 +1 收起 理由
高境 + 1 赞一个!

查看全部评分

11 个回复

正序浏览
王晓明 发表于 2013-1-25 12:00
很好,很强大!呵呵,今早我经过一哥们的解惑,也解决了,和你说的一样!就是两个流的关闭问题,十分感谢 ...

;P昨天晚上没在看帖子不是。。。还好吧
回复 使用道具 举报
杨世平 发表于 2013-1-25 10:44
代码写错了,建议封装下吧,我测试了了下代码发现了问题..

在for循环下 if(f.isFile()){}这个后面,还有你这 ...

很好,很强大!呵呵,今早我经过一哥们的解惑,也解决了,和你说的一样!就是两个流的关闭问题,十分感谢你的帮助,你要是昨晚就回答我了,那是最好了!哈哈,谢谢哥们了,你的水平很强大!看了你的解惑,思路很清晰,很有想法!现在问题已解决,代码也重新封装了,心情舒服多了!
回复 使用道具 举报
梁俊 发表于 2013-1-25 09:01
关闭流也不行,我试了,去掉与流有关的操作才可以delete,也不知道到底为什么 ...

还是流的关闭问题,我使用了两次流,就得关闭两次,5楼的兄弟解决的很好!
回复 使用道具 举报
arno942 发表于 2013-1-24 23:15
是这样的效果吗?  希望对你有点帮助,如果还有哪里不是很清楚,可以问我 ...

谔谔。貌似你没考虑到这种情况,假如文件全名是Demo1.java.java呢?这种命名也是可以的!
还有,是要求先复制,然后对源文件进行改名的,不是先改名吧!
回复 使用道具 举报
胡勇敏 发表于 2013-1-24 22:28
首先第一点,哥们你的问题是 这么多代码全写在main函数中,这种做法是很烂的,会影响程序的执行效率,也会 ...

嗯嗯,谢谢,问题已解决!主要是流的关闭问题!我使用了两次流,就得关两次!
回复 使用道具 举报
梁俊 黑马帝 2013-1-25 11:49:25
7#
胡勇敏 发表于 2013-1-25 10:33
你怎么写的代码贴出来看下。

还是少关流了,现在对了
回复 使用道具 举报
本帖最后由 杨世平 于 2013-1-25 10:57 编辑

代码写错了,建议封装下吧,我测试了了下代码发现了问题..

在for循环下 if(f.isFile()){}这个后面,还有你这句其实不用加的,你前面的File[] files = srcFile.listFiles();取的已经是文件夹下的所有文档了....你还继续判断是不是文档?

                if (f.exists()) {
                System.out.println(f.getAbsoluteFile());
                if (!f.delete()) {
                    System.out.println("请关闭使用该文件的所有进程或者流!!");
                } else {
                    System.out.println(f.getName()+" 成功被删除!");
                }
            }
在这里输出的语句时
d:\java\ProductDAO.jad
ProductDAO.jad 成功被删除!
d:\java\ProductDAO.java
请关闭使用该文件的所有进程或者流!!

这说明你的f值在变,先变成.jad......
你现在的代码不好修改,我建议你封装下,写个类,3个方法,复制,改成.jad,还有个删除文件的方法..这样就不会出现关闭流的问题


刚刚才想到问题所在,你分别应了输入和输出流2次所以你要关闭2次....你应该在复制的关闭一次,变成.jad时关闭一次..原因就是你的流没关干净..如果你不想封装的话代码如下
package dao;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.registry.DeleteException;

/*9、 编写一个程序,将d:\java 目录下的所有.java 文件
* 复制到d:\jad 目录下,
* 并将原来文件的扩展名从.java 改为.jad。
*/
public class Test9 {
public static void main(String[] args) throws Exception {

  //指定目标文件
  File srcFile=new File("d:\\java");
  //指定目的路径
  File destFile = new File("d:\\jad");
  
  File[] files = srcFile.listFiles();
  for(File f:files){
   
    //System.out.println(f);
    String name = f.getName();
    if(name.endsWith(".java")){
     //创建输入流。并关联目标文件
     FileInputStream fis = new FileInputStream(f);
     //创建输出流,关联输出目录
     FileOutputStream fos = new FileOutputStream(new File(destFile,name));
     //调用缓冲数组,为了提高效率,使用1024*1024的数组
     byte[] byt=new byte[1024*1024];
     //定义一个变量接受数组数据
     int len=0;
     while((len=fis.read(byt))!=-1){
      fos.write(byt, 0, len);
     }
//关闭流!  在这里再加次关闭流就好了
     fis.close();
     fos.close();
     //抽取文件名后缀名的角标
     int lastIndexOf = name.lastIndexOf(".java");
     //抽取文件名中非后缀名的子字符串
     String substring = name.substring(0, lastIndexOf);
     //将子字符串和.jad组合成新文件名
     String newname = substring.concat(".jad");
     //以新文件名在源目录创建新空白文件
     File file2 = new File(srcFile,newname);
     fis=new FileInputStream(f);
     fos=new FileOutputStream(file2);
     while((len=fis.read(byt))!=-1){
      fos.write(byt, 0, len);
     }
     
     //关闭流!
     
     fis.close();
     fos.close();
     
    }
    //删除源目录里的java文件
   if (f.exists()) {
                System.out.println(f.getAbsoluteFile());
                if (!f.delete()) {
                    System.out.println("请关闭使用该文件的所有进程或者流!!");
                } else {
                    System.out.println(f.getName()+" 成功被删除!");
                }
               
            }
  }
  
  
}
}

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
梁俊 发表于 2013-1-25 09:01
关闭流也不行,我试了,去掉与流有关的操作才可以delete,也不知道到底为什么 ...

你怎么写的代码贴出来看下。
回复 使用道具 举报
胡勇敏 发表于 2013-1-24 22:28
首先第一点,哥们你的问题是 这么多代码全写在main函数中,这种做法是很烂的,会影响程序的执行效率,也会 ...

关闭流也不行,我试了,去掉与流有关的操作才可以delete,也不知道到底为什么
回复 使用道具 举报
本帖最后由 arno942 于 2013-1-24 23:20 编辑

是这样的效果吗?  希望对你有点帮助,如果还有哪里不是很清楚,可以问我
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.FilenameFilter;
  7. import java.io.IOException;

  8. /*
  9. *编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,
  10. *并将原来文件的扩展名从.java改为.jad。
  11. */
  12. public class Demo1 {
  13.         public static void main(String[] args) throws Exception {
  14.                 File file = new File("d:\\java");
  15.                 // 判断要访问的目录是否存在 ,如果为true 出异常
  16.                 if (!(file.exists() && file.isDirectory()))

  17.                         throw new Exception("目录不存在");

  18.                 File[] file2 = file.listFiles(new FilenameFilter() {

  19.                         public boolean accept(File dir, String name) {

  20.                                 return name.endsWith(".java");
  21.                         }
  22.                 });
  23.                 File file1 = new File("d:\\jad");
  24.                 // 判断要存的目录是否存在, 如果为true,就创建一个目录
  25.                 if (!(file1.exists())) {
  26.                         file1.mkdir();
  27.                 }

  28.                 for (File file3 : file2) {
  29.                         if (file3.isFile()) {
  30.                                 BufferedReader br = new BufferedReader(new FileReader(file3));
  31.                                 // 到这里的文件已经都是.java文件了,得到文件名字,获取扩展名.java换成.txt
  32.                                 String str = file3.getName().replaceAll(".java", ".txt");
  33.                                 BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
  34.                                                 file1, str)));
  35.                                 // 文件进行copy
  36.                                 copy(br, bw);
  37.                                 br.close();
  38.                                 bw.close();
  39.                         }
  40.                 }

  41.         }

  42.         // 单个文件copy封装方法
  43.         public static void copy(BufferedReader br, BufferedWriter bw)
  44.                         throws IOException {

  45.                 String st = null;
  46.                 while ((st = br.readLine()) != null) {
  47.                         bw.write(st);
  48.                         bw.newLine();
  49.                 }
  50.         }

  51. }
复制代码

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 胡勇敏 于 2013-1-24 22:30 编辑

首先第一点,哥们你的问题是 这么多代码全写在main函数中,这种做法是很烂的,会影响程序的执行效率,也会影响程序的可读性。建议将复制文件并改名的功能单独抽取封装为一个函数,将删除文件单独封装函数。第二点就是针对你提的问题,当代码执行到f.delete()时。你的输入输出流尚未关闭,文件还在被占用呢,你当然不能删除。所以你需要先关闭流在进行删除操作,才能正常的把文件删除掉。

评分

参与人数 1黑马币 +12 收起 理由
Rancho_Gump + 12 赞一个!

查看全部评分

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