io-File类实现文件拷贝(拷贝文件夹、以及文件夹里面的文件)
需求:
拷贝文件目录、以及文件目录下所对应的文件
/* 拷贝目录 */ public class CopyAll { public static void main(String[] args) { // 拷贝源 File srcFile = new File("D:\\course\\02-JavaSE\\document"); // 拷贝目标 File destFile = new File("C:\\a\\b\\c"); // 调用方法拷贝 copyDir(srcFile, destFile); } /** * 拷贝目录 * @param srcFile 拷贝源 * @param destFile 拷贝目标 */ private static void copyDir(File srcFile, File destFile) { if(srcFile.isFile()) { // srcFile如果是一个文件的话,递归结束。 // 是文件的时候需要拷贝。 // ....一边读一边写。 FileInputStream in = null; FileOutputStream out = null; try {
// 读这个文件: D:\course\02-JavaSE\document\JavaSE进阶讲义\JavaSE进阶-01-面向对象.pdf in = new FileInputStream(srcFile);
// 写到这个文件中:// C:\course\02-JavaSE\document\JavaSE进阶讲义\JavaSE进阶-01-面向对象.pdf //srcFile.getAbsolutePath().substring(3) 3代表下标从零开始,第四个元素的下标;字符串拼接 String path = (destFile.getAbsolutePath().endsWith("\\") ? destFile.getAbsolutePath() : destFile.getAbsolutePath() + "\\")
+ srcFile.getAbsolutePath().substring(3); out = new FileOutputStream(path);
// 一边读一边写 byte[] bytes = new byte[1024 * 1024]; // 一次复制1MB int readCount = 0; while((readCount = in.read(bytes)) != -1){ out.write(bytes, 0, readCount); }
//字节输出流 :刷新flush() out.flush();
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally {
//分开关闭资源 if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } return; }
// 获取源下面的子目录:有可能是文件,也可能是文件夹 File[] files = srcFile.listFiles(); for(File file : files){
// 获取所有文件的(包括目录和文件)绝对路径 //测试输出看下文件 //System.out.println(file.getAbsolutePath()); if(file.isDirectory()){ // 新建对应的目录 //System.out.println(file.getAbsolutePath()); //D:\course\02-JavaSE\document\JavaSE进阶讲义 源目录 //C:\course\02-JavaSE\document\JavaSE进阶讲义 目标目录 String srcDir = file.getAbsolutePath(); //srcDir.substring(3);3,表示该目录元素下标(第四个元素):D:\course\02-JavaSE\document\JavaSE进阶讲义 String destDir = (destFile.getAbsolutePath().endsWith("\\") ? destFile.getAbsolutePath() : destFile.getAbsolutePath() + "\\") + srcDir.substring(3); File newFile = new File(destDir); if(!newFile.exists()){ newFile.mkdirs(); } }
// 递归调用 copyDir(file, destFile); } }