java如何复制文件夹及文件夹中文件呢?
下文笔者讲述使用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(); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。