java如何复制文件夹及文件夹中文件呢?

书欣 Java经验 发布时间:2022-09-07 10:50:55 阅读数:19756 1
下文笔者讲述使用java代码复制文件夹及文件夹中所有文件的方法分享,如下所示
实现思路:
     通过复制文件夹和复制文件
	 两个不同的角度对对象进行复制
例:
package com.java265;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Linkedlist;
 
 
public class fileUtill {
 
	public static void main(String[] args) {
//		 File source = new File("D:/file");  
//		 File dest = new File("D:/file1"); 
		 String source = "D:/file";
		 String dest = "D:/file1";
		 try {
			//copyFolder(source,dest);
			 copyFolder2(source,dest);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	//---------------------------方法1-----------------------------------------
	
	/**
     * 复制文件夹/文件(仅复制单层无法递归)
     *
     * @param resource 源路径
     * @param target   目标路径
     */
    public static void copyFolder(String resource, String target) throws Exception {
 
        File resourceFile = new File(resource);
        if (!resourcefile.exists()) {
            throw new Exception("源目标路径:[" + resource + "] 不存在...");
        }
        File targetFile = new File(target);
        if (!targetFile.exists()) {
            throw new Exception("存放的目标路径:[" + target + "] 不存在...");
        }
 
        // 获取源文件夹下的文件夹或文件
        File[] resourceFiles = resourceFile.listFiles();
 
        for (File file : resourceFiles) {
 
            File file1 = new File(targetFile.getAbsolutePath() + File.separator + resourceFile.getName());
            // 复制文件
            if (file.isFile()) {
                System.out.println("文件" + file.getName());
                // 在 目标文件夹(B) 中 新建 源文件夹(A),然后将文件复制到 A 中
                // 这样 在 B 中 就存在 A
                if (!file1.exists()) {
                    file1.mkdirs();
                }
                File targetFile1 = new File(file1.getAbsolutePath() + File.separator + file.getName());
                copyFile(file, targetFile1);
            }
            // 复制文件夹
            if (file.isDirectory()) {// 复制源文件夹
                String dir1 = file.getAbsolutePath();
                // 目的文件夹
                String dir2 = file1.getAbsolutePath();
                copyFolder(dir1, dir2);
            }
        }
 
    }
	
    /**
     * 复制文件
     *
     * @param resource
     * @param target
     */
    public static void copyFile(File resource, File target) throws Exception {
        // 输入流 --> 从一个目标读取数据
        // 输出流 --> 向一个目标写入数据
 
        long start = System.currentTimeMillis();
 
        // 文件输入流并进行缓冲
        FileInputStream inputStream = new FileInputStream(resource);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
 
        // 文件输出流并进行缓冲
        FileOutputStream outputStream = new FileOutputStream(target);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
 
        // 缓冲数组
        // 大文件 可将 1024 * 2 改大一些,但是 并不是越大就越快
        byte[] bytes = new byte[1024 * 2];
        int len = 0;
        while ((len = inputStream.read(bytes)) != -1) {
            bufferedOutputStream.write(bytes, 0, len);
        }
        // 刷新输出缓冲流
        bufferedOutputStream.flush();
        //关闭流
        bufferedInputStream.close();
        bufferedOutputStream.close();
        inputStream.close();
        outputStream.close();
 
        long end = System.currentTimeMillis();
 
        System.out.println("耗时:" + (end - start) / 1000 + " s");
 
    }
    
  //---------------------------方法2-----------------------------------------
    /**
     * 复制文件夹/文件(仅复制单层无法递归)
     *
     * @param resource 源路径
     * @param target   目标路径
     */
    
    public static void copyFolder2(String resource, String target) throws IOException  {
    	LinkedList<String> folderList = new LinkedList<String>();   
    	folderList.add(resource);   
    	LinkedList<String> folderList2 = new LinkedList<String>();   
    	folderList2.add(target+ resource.substring(resource.lastIndexOf("/")));   
    	while (folderList.size() > 0) {   
    	    (new File(folderList2.peek())).mkdirs(); // 如果文件夹不存在 则建立新文件夹   
    	    File folders = new File(folderList.peek());   
    	    String[] file = folders.list();   
    	    File temp = null;   
    	    try {   
    	        for (int i = 0; i < file.length; i++) {   
    	            if (folderList.peek().endsWith(File.separator)) {   
    	                temp = new File(folderList.peek() + File.separator   
    	                + file[i]);   
    	            } else {   
    	                temp = new File(folderList.peek() + File.separator + file[i]);   
    	            }   
    	            if (temp.isFile()) {   
    	                FileInputStream input = new FileInputStream(temp);   
    	                FileOutputStream output = new FileOutputStream(   
    	                folderList2.peek() + File.separator + (temp.getName()).toString());   
    	                byte[] b = new byte[5120];   
    	                int len;   
    	                while ((len = input.read(b)) != -1) {   
    	                    output.write(b, 0, len);   
    	                }   
    	                output.flush();   
    	                output.close();   
    	                input.close();   
    	            }   
    	            if (temp.isDirectory()) {// 如果是子文件夹   
    	                for (File f : temp.listFiles()) {   
    	                    if (f.isDirectory()) {   
    	                        folderList.add(f.getPath());   
    	                        folderList2.add(folderList2.peek()   
    	                        + File.separator + f.getName());   
    	                    }   
    	                }   
    	            }   
    	        }   
    	    } catch (Exception e) {   
    	    //System.out.println("复制整个文件夹内容失败!");   
    	        e.printStackTrace();   
    	    }   
//    	    folderList.removeFirst();   
//    	    folderList2.removeFirst();   
    	    folderList.clear();
    	    folderList2.clear();
    	}
    }
	
	
  //---------------------------方法3-----------------------------------------
	
    /**
     * 复制文件夹/文件(递归)
     *
     * @param srcFolder 源路径
     * @param destFolder   目标路径
     */
 
    public static void copyFolder3(File srcFolder, File destFolder) throws IOException  {
        // TODO Auto-generated method stub
        //判断该File是文件夹还是文件
        if(srcFolder.isDirectory()){
            //是文件夹
            //在目的地创建相同目录
            File newFolder = new File(destFolder,srcFolder.getName());
            newFolder.mkdir();
            //遍历该对象
            File [] fileArray=srcFolder.listFiles();
            for(File file:fileArray){
                 //递归文件夹
            	copyFolder3(file, newFolder);
            }
 
        }else{
            //是文件
            //递归出口
            String name=srcFolder.getName();
            File NewFile = new File(destFolder,name);
            copy3(srcFolder,NewFile);
        }
    }
    //复制文件
    public static void copy3(File file, File newFile) throws IOException {
        // TODO Auto-generated method stub
        //创建字节流缓冲对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile));
 
        //读写数据
        byte [] bys=new byte[1024];
        int len=0;
        while((len=bis.read(bys))!=-1){
            bos.write(bys, 0, len);
        }
 
        //释放资源
        bis.close();
        bos.close();
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202209/16625190864368.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者