黑马程序员技术交流社区

标题: 帮忙改正下代码 [打印本页]

作者: 陈山    时间: 2012-11-19 11:32
标题: 帮忙改正下代码
本帖最后由 陈山 于 2012-11-20 22:29 编辑

需求:把当前文件夹中的 N 个文件夹中的avi视频剪切到当前文件中的一个新的文件夹里
我写的代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CutAVI {

        /**
         * 1.遍历avi文件 ,增强for,递归
         * 2.拷贝avi文件到一个新的文件夹,FileInputStream,FileOutputStream
         * 3.删除遍历的avi文件
         */
        public static void main(String[] args) throws IOException {
                File file=new File("E:\\test");//创建File实例,路径为当前文件夹路径
                copyAndDelete(file);
               
               
               

        }
        public static void copyAndDelete(File file) throws IOException{//拷贝文件到新的文件夹,然后删除文件
                File[] files=file.listFiles();//获取当前文件夹下的所有文件对象
                for(File f:files){//遍历当前文件夹下所有文件和文件夹
                        
        
                        if(f.isDirectory()){//如果文件对象是文件夹
                                copyAndDelete(f);//递归
                        }else{
                                if(f.getAbsolutePath().endsWith(".avi")){//如果文件的文件名以”.avi“结尾,拷贝文件到新的文件夹里面
                                       
                                        FileInputStream fis=new FileInputStream(f);//创建输入流
                                        String str="e:\\test\\newfloder\\"+f.getName();//拷贝后文件的路径
                                        File newF=new File(str);//创建拷贝后的文件对象
                                        if(!newF.exists()){//如果文件不存在
                                                newF.createNewFile();//创建文件
                                        }
                                        FileOutputStream fos=new FileOutputStream(newF);//创建输出流
                                        //拷贝
                                        byte [] bytes=new byte[1024];
                                        int len=0;
                                        while((len=fis.read(bytes))!=-1){
                                                fos.write(bytes);
                                                fos.flush();
                                        }        
                                        fis.close();//关闭输入流
                                        fos.close();//关闭输出流
                                        f.delete();//删除源文件
                                }
                        }
                }
        }

}
问题:程序运行后,先把当前文件夹所有的avi文件复制到了当前文件夹里面一个新的文件夹,但是之后又把所有的avi文件删除了,包括新的文件夹里面的文件,问题在哪里呢?该怎么改进下?
作者: 李计伟    时间: 2012-11-19 12:55
本帖最后由 李计伟 于 2012-11-19 13:10 编辑

运行了一下你的程序有问题如果E:\\test  没有这个newfloder文件夹就会报错 Exception in thread "main" java.io.IOException: 系统找不到指定的路径。我运行你程序传个视频文件等了好久, 改了一下你的程序用缓冲流能快一点,把delete()方法放外面就只删原文件了,改的我都用//---------------------------标记了。
  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;

  7. public class CutAVI{
  8.         public static void main(String[] args) throws IOException {
  9.          File file=new File("E:\\test");//创建File实例,路径为当前文件夹路径
  10.          copyAndDelete(file);
  11. }



  12. public static void copyAndDelete(File file) throws IOException{//拷贝文件到新的文件夹,然后删除文件
  13.            File[] files=file.listFiles();//获取当前文件夹下的所有文件对象
  14.            for(File f:files){//遍历当前文件夹下所有文件和文件夹
  15.            if(f.isDirectory()){//如果文件对象是文件夹
  16.            copyAndDelete(f);//递归
  17.            }else{
  18.                       if(f.getAbsolutePath().endsWith(".avi")){//如果文件的文件名以”.avi“结尾,拷贝文件到新的文件夹里面
  19. //--------------------------------------------------------------------------------------------------------------
  20.                             BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); //创建输入流
  21.                             File newF=new File("E:\\test\\newfloder");//创建拷贝后的文件对象
  22.                             if(!newF.exists()){//如果文件不存在
  23.                             newF.mkdir();//创建文件夹
  24.                             }
  25.                             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\test\\newfloder\\"+f.getName())); //创建输出流
  26.                              int b = 0;
  27.                              while ((b = bis.read()) != -1) {
  28.                              bos.write(b);
  29.                              }
  30.                              //拷贝
  31.                              bis.close();//关闭输入流
  32.                              bos.close();//关闭输出流
  33.                            }
  34.                      }
  35.                      f.delete();//删除源文件
  36. //---------------------------------------------------------------------------------------------------------------------
  37.                   }
  38.         }
  39. }
复制代码





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