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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马陈旭东 中级黑马   /  2012-6-13 21:32  /  2471 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//需求是这样的!
我有一个目录里有很多壁纸分散在很多子目录里!你懂得,360的那个!
我想把这些壁纸都复制到没有子目录的文件夹里! 当然!能剪切就最好!
是纠结了很久的代码!没法完成之后上来求救了


package test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileTest1 {
/**
  * @param args
  * @throws IOException
  */
/*
  * 想要列出指定的目录下的所有内容。包含着子目录中的内容。
  *  思路:
  *   1:获取指定目录的内容
  *    a:因为目录下有子目录,所以考虑用到递归
  *   2:将这些文件复制到一个文件中。
  *    a:用IO流
  *    b; 明确1:数据源和目的地都是硬盘,明确2:因为是媒体文件,所以都是字节
  *    c; 需要高效,所以用到缓冲流;
  */
public static void main(String[] args) throws IOException {
  
  //把一个目录封装成对象便于操作
  File file = new File("E:\\360Download");
  
  File[] files = file.listFiles();
  //建立读取流跟读入流
  BufferedInputStream bufs =null;
     
   BufferedOutputStream bufw =null;
   new BufferedOutputStream( new FileOutputStream("E:\\My piture"));
  
  
  
  read_Test(file,files,bufs,bufw);
  
  
}
public static void read_Test(File file ,File[] files,BufferedInputStream bufs,BufferedOutputStream bufw) throws IOException {
  

  
  for(File names: files)
  {
   if(names.isDirectory())
   {
    read_Test(names,files,bufs,bufw);//已经获取一个目录下所有的文件名字,包括子目录下的
   }
   //System.out.println(names); //但是发现目录中还有目录,所以考虑用递归
   else
   {
    if(names.isFile())
    {
     bufs=new  BufferedInputStream( new FileInputStream(names));
     bufw =new BufferedOutputStream( new FileOutputStream("E:\\My piture"));
        byte[] by = new byte[1024*1024];
        int len =0;
        while((len=bufs.read(by))!=-1)
        {
         bufw.write(by, 0, len);
         bufw.flush();
         
        }
        bufs.close();
        bufw.close();
        
    }
   
   }
  }
  
  
  
}
}

评分

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

查看全部评分

9 个回复

正序浏览
邓杰 发表于 2012-6-14 11:36
代码经过反复修改。有的仅供测试和验证的代码注释忘记删了;希望不会影响到你; ...

哥们很给力!
回复 使用道具 举报
邓杰 中级黑马 2012-6-14 11:36:26
9#
代码经过反复修改。有的仅供测试和验证的代码注释忘记删了;希望不会影响到你;
回复 使用道具 举报
邓杰 中级黑马 2012-6-14 11:32:44
8#
以前也一直想写一个类似的程序来把我电脑里的文件分类整理;今天看你在求助,我就试了试;
擦!!花哥三个多小时;看来真是很不熟练啊;不过好坏写出来了;已经通过测试;希望可以帮到你;
老师看能不能多给点分啊;实在太辛苦了;
不多说 直接上代码:
/*
思路
1 遍历A文件夹;
2 判断A文件夹中的文件类型;如果是文件夹遍历;
3 如果是自己要复制的文件类型则复制;为了功能扩展用字节流;
4 为了提高效率;使用缓冲区;

*/
import java.io.*;
class  CopyDirFile
{
public static void main(String[] args) throws Exception//关于异常我就不处理了啊;太耽误时间了;
{
  
  //new BianLiDir().showDir("D:\\Java\\studyNote\\");
  new BianLiDir("D:\\Java\\studyNote\\","f:\\myjava\\").showDir();
}
}
class BianLiDir
{
private static String outdir;//需要写入的目标文件夹;
private static String indir;//需要被扫描目标文件夹;
BianLiDir(String indir,String outdir)
{
  this.indir=indir;
  this.outdir=outdir;
}
public static void showDir()throws Exception//函数重载 方法调用;
{
  showDir(indir);
}
public static void showDir(String indir)throws Exception//函数重载
{
  File dir=new File(indir);
  showDir(dir);
}
public static void showDir(File dir)throws Exception
{
  //File dir=new File(indir);
  File[] files=dir.listFiles();
  for (int x=0;x<files.length ;x++ )
  {
   if (files[x].isDirectory())//判断该文件是否是一个目录;
   {
    showDir(files[x]);
   }
   else //如果不是一个目录
   {
    String Filename=files[x].getName();//获取该文件的名称;
   
   
    if (Filename.endsWith(".jpg"))//判断是否是一个图片文件;可以多重判断因为图片的类型不只一种。你就自己写了哈;
           //不只是图片可以改为你想copy的任意文件;本应该定义一个变量来记录“.jpg”不过实在耽误了太时间;
           //你就自己弄吧;
    {
     
     String pathName=dir.getCanonicalPath();//获取文件的路径
     //调用CopyFile的copy的方法;把文件复制到指定的文件夹中;
     //new CopyFile().copy(pathName+"\\"+Filename,"f:\\myjava\\"+Filename);
     new CopyFile().copy(pathName+"\\"+Filename,outdir+Filename);
     //如果要执行剪切功能可以在此处添加dir.delete();复制完成后删除原谅件;
     //慎用:未测试 且不经过回收站;
     //System.out.println(pathName+Filename);
    }
   }
  }
}
}
class  CopyFile//此类是复制动作;
{
private static FileOutputStream fos= null;
private static FileInputStream fis = null;
private static String outdir;
private static String indir;
public static void copy(String indir,String outdir)
{
  try
  {
    fos=new FileOutputStream(outdir);
    fis=new FileInputStream(indir);
    byte[] buf=new byte[1024*10];
    int len=0;
    while ((len=fis.read(buf))!=-1)
    {
     fos.write(buf,0,len);
    }
   
  }
  catch (IOException e)
  {
   throw new RuntimeException("读写失败");
  }
  finally
  {
   try
   {
    if (fos!=null)
    {
     fos.close();
    }
   }
   catch (IOException e)
   {
    throw new RuntimeException("读取关闭失败");
   }
   try
   {
    if (fis!=null)
    {
     fis.close();
    }
   }
   catch (IOException e)
   {
    throw new RuntimeException("写入关闭失败");
   }
   
  }
  
}
}
回复 使用道具 举报
如果不限定使用的编程语言的话……
假设在D盘根目录下有a文件夹,a里面有很多子文件夹,子文件夹里面可能还有子文件夹,很多图片就分散在这些子孙文件夹中,现在要将这些图片都剪切到D盘根目录下b文件夹里,b此时是空的。
方法:运行->cmd,输入命令 for /r D:/a %1 in (*.jpg) do move %1 D:/b 回车即可,若还有其他格式文件夹,把括号里面的改一下,就行了。此举完成之后,a下面所有所有图片都到b里面去了。
回复 使用道具 举报
图片的扩展名可能是大写的,所以我在获取扩展名的时候统一改成小写了。
还有,别忘了关IO流,不然会有意想不到的错误。

其他注意点我想也没神马了。就是递归遍历文件夹。是文件就访问测试下,是文件夹就进入递归调用。
回复 使用道具 举报
  1. package cn.ywl.io;

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

  6. public class CopyPrctureToNew {

  7.         public static void main(String[] args) throws IOException {
  8.                 // TODO Auto-generated method stub

  9.                 File filesrc = new File("F:\\一些图片");
  10.                 File filedes = new File("F:\\Mypicture");
  11.                 copyToNew(filesrc,filedes);
  12.         }

  13.         /**
  14.          * @param filesrc
  15.          * @param filedes
  16.          * @throws IOException
  17.          *
  18.          * 思路是一遍遍历目录下的每一个文件,判断是否是图片,如果是,拷贝到指定目录下
  19.          *
  20.          */
  21.         private static void copyToNew(File filesrc , File filedes) throws IOException {

  22.                 File[] files = filesrc.listFiles();
  23.                
  24.                 FileInputStream fin = null;
  25.                 FileOutputStream fos = null ;
  26.                
  27.                 for(File file:files){
  28.                        
  29.                         if(file.isFile()){
  30.                                
  31.                                 String filename = file.getName();
  32.                                 String extendsname = filename.substring(filename.lastIndexOf('.')+1).toLowerCase();
  33.                                
  34.                                 if(extendsname.equals("bmp")||extendsname.equals("jpg")||extendsname.equals("jpeg")||extendsname.equals("png")||extendsname.equals("gif")){
  35.                                        
  36.                                         try {
  37.                                        
  38.                                                 fin = new FileInputStream(file);
  39.                                                 File des = new File(filedes.getAbsolutePath()+"\\"+filename);
  40.                                                 des.createNewFile();
  41.                                                 fos = new FileOutputStream(des);
  42.                                                
  43.                                                 int len = 0;
  44.                                                 byte[] buf = new byte[1024];
  45.                                                
  46.                                                 while((len = fin.read(buf))!= -1){
  47.                                                         fos.write(buf, 0, len);
  48.                                                 }
  49.                                                 //file.delete();             // 如要要剪切,就把这句的注释取消;
  50.                                        
  51.                                         } catch (Exception e) {
  52.                                                 e.printStackTrace();
  53.                                         }finally{
  54.                                                 fin.close();
  55.                                                 fos.close();
  56.                                         }
  57.                                 }
  58.                         }else{
  59.                                 copyToNew(file,filedes);
  60.                         }
  61.                        
  62.                 }
  63.         }

  64.        
  65. }
复制代码
回复 使用道具 举报
  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. public class FileTest1 {
  7. /**
  8.    * @param args
  9.    * @throws IOException
  10.   */
  11. /*
  12.    * 想要列出指定的目录下的所有内容。包含着子目录中的内容。
  13.   *  思路:
  14.    *   1:获取指定目录的内容
  15.    *    a:因为目录下有子目录,所以考虑用到递归
  16.    *   2:将这些文件复制到一个文件中。
  17.    *    a:用IO流
  18.    *    b; 明确1:数据源和目的地都是硬盘,明确2:因为是媒体文件,所以都是字节
  19.    *    c; 需要高效,所以用到缓冲流;
  20.    */
  21.          
  22.          public  BufferedInputStream bufr;
  23.          public  BufferedOutputStream bufw;
  24.          
  25.          
  26.          
  27.         public static void main(String[] args) throws Exception {
  28.                 new FileTest1().copy(new File("F:\\照片"));

  29.         }
  30.        
  31.         public  void copy(File files)throws Exception{
  32.                
  33.                 if(files.isDirectory()){
  34.                         File[] file_list = files.listFiles();
  35.                        
  36.                         for(File file:file_list){
  37.                                
  38.                                 //如果是文件夹,递归
  39.                                 if(file.isDirectory()){
  40.                                         copy(file);
  41.                                 }else{
  42.                                         //读取
  43.                                         bufr = new BufferedInputStream(new FileInputStream(file));
  44.                                         System.out.println("正在复制文件:"+file.getName());
  45.                                         bufw =new BufferedOutputStream( new FileOutputStream("E:\\My piture\\"+file.getName()));
  46.                                        
  47.                                         byte[] b = new byte[1024];
  48.                                         int len ;
  49.                                         while((len = bufr.read(b))!=-1){
  50.                                                 bufw.write(b, 0, len);
  51.                                                 bufw.flush();
  52.                                         }

  53.                                         //关闭读取流
  54.                                         bufr.close();
  55.                                         bufw.close();
  56.                                          //删除文件
  57.                                         if(file.delete()){
  58.                                                 System.out.println("删除成功");
  59.                                         }
  60.                                 }       
  61.                         }
  62.                 }
  63.                
  64.         }

  65. }
复制代码
核心就这几行代码~
你想分类啊 什么的 只要略加修改就可以了
回复 使用道具 举报
简单看了一下,递归有点乱!等会给你写一个
回复 使用道具 举报
很久了!怎么还没高人呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马