利用通道以及递归方法拷贝文件的代码案例

public static void main(String[] args) throws IOException {
//源文件夹
String url1="F:/file";
//目标文件夹
String url2="F:/test/项目测试数据包";
long start,end;
start = System.currentTimeMillis();
   // TODO Auto-generated method stub
for(int j=1;j<=25;j++){
//创建目标文件夹
String newUrl2 = url2+j;
 (new File(newUrl2)).mkdirs();
 //获取源文件夹当前下的文件或目录
  File[] file=(new File(url1)).listFiles();
  for (int i = 0; i < file.length; i++) {
   if(file[i].isFile()){
       //复制文件
    fileChannelCopy(file[i],new File(newUrl2+File.separator+file[i].getName()));
   }
   if(file[i].isDirectory()){
       //复制目录
           String sorceDir=url1+File.separator+file[i].getName();
           String targetDir=newUrl2+File.separator+file[i].getName();
           copyDirectiory(sorceDir, targetDir);
       }
   }
}
   
  end = System.currentTimeMillis();
  System.out.println("文件通道用时"+(end-start));
  //System.out.println("缓冲流用时"+(end-start));
}
 
public static void copyFile(File sourcefile,File targetFile) throws IOException{
//新建文件输入流并对它进行缓冲
FileInputStream input=new FileInputStream(sourcefile);
BufferedInputStream inbuff=new BufferedInputStream(input);

//新建文件输出流并对它进行缓冲
FileOutputStream out=new FileOutputStream(targetFile);
BufferedOutputStream outbuff=new BufferedOutputStream(out);

//缓冲数组
byte[] b=new byte[1024*5];
int len=0;
while((len=inbuff.read(b))!=-1){
   outbuff.write(b, 0, len);
}

//刷新此缓冲的输出流
outbuff.flush();

//关闭流
inbuff.close();
outbuff.close();
out.close();
input.close();
}

public static void copyDirectiory(String sourceDir,String targetDir) throws IOException{
   //新建目标目录
   
   (new File(targetDir)).mkdirs();
   
   //获取源文件夹当下的文件或目录
   File[] file=(new File(sourceDir)).listFiles();
   for (int i = 0; i < file.length; i++) {
       if(file[i].isFile()){
           //源文件
           File sourceFile=file[i];
               //目标文件
           File targetFile=new File(new File(targetDir).getAbsolutePath()+File.separator+file[i].getName());
           
           copyFile(sourceFile, targetFile);
       
       }
       if(file[i].isDirectory()){
           //准备复制的源文件夹
           String dir1=sourceDir+"/"+file[i].getName();
           //准备复制的目标文件夹
           String dir2=targetDir+"/"+file[i].getName();
           
           copyDirectiory(dir1, dir2);
       }
   }
}

public static void fileChannelCopy(File s, File t) {

       FileInputStream fi = null;

       FileOutputStream fo = null;

       FileChannel in = null;

       FileChannel out = null;

       try {

           fi = new FileInputStream(s);

           fo = new FileOutputStream(t);

           in = fi.getChannel();//得到对应的文件通道

       out = fo.getChannel();//得到对应的文件通道

       in.transferTo(0, in.size(), out);//连接两个通道,并且从in通道读取,然后写入out通道

   } catch (IOException e) {

       e.printStackTrace();

   } finally {

       try {
        if(null!=fi) fi.close();
        if(null!=in) in.close();
        if(null!=fo) fo.close();
        if(null!=out)out.close();
       } catch (IOException e) {
           e.printStackTrace();
       }

   }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值