IO流学习之综合运用(文件复制)
通过File、字节流、字节流缓冲区实现文件复制
需求:
1、用File类读取指定文件File下的所有文件(包括Copy文件夹内的所有文件)
2、将所有文件复制到指定文件FileCopy夹下
需求分析:
1、需要先读取到指定的文件夹File
2、判断File文件夹下的文件类型( 文件 or 文件夹 )
3、把文件读取到内存中(递归查询文件)
4、考虑指定文件夹FileCopy下不存在Copy文件夹怎么办?(分析File类的方法)
5、把文件从内存中写到指定文件夹下
代码实例:
1 package InputOutput; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 11 public class CopyFileDemo { 12 public static void main(String[] args) throws IOException { 13 // 指定源文件路径 14 String srcPath = "E:/JavaCodeDemo/InputOutput/File"; 15 // 指定目标文件路径 16 String desPath = "E:/JavaCodeDemo/InputOutput/FileCopy"; 17 // 创建源File 18 File srcFile = new File(srcPath); 19 // 创建目标File 20 File desFile = new File(desPath); 21 // 复制文件 22 copFile(srcFile, desFile); 23 // 复制完成 24 System.out.println("Success!"); 25 } 26 27 public static void copFile(File srcFile, File desFile) throws IOException { 28 // 获取所有文件和文件夹的集合 29 File[] fileList = srcFile.listFiles(); 30 // 遍历集合 31 for (File file : fileList) { 32 // 判断是否为文件夹 33 if (file.isDirectory()) { 34 // 获取文件夹名称 35 String folderName = file.getName(); 36 // 创建目标路径File 37 File newFile = new File(desFile, folderName); 38 // 判断目标路径File对应的文件夹是否存在 39 if (!newFile.exists()) { 40 // 如果不存在创建新的文件夹 41 newFile.mkdirs(); 42 } 43 // 循环调用方法获取创建所有文件夹 44 copFile(file, newFile); 45 } else { 46 // 获取文件的名称 47 String name = file.getName(); 48 // 根据文件名称创建新的File 49 File finalPathFile = new File(desFile, name); 50 // 调用IO流复制文件 51 IOStream(file, finalPathFile); 52 } 53 } 54 } 55 56 public static void IOStream(File file2, File finalFile) throws IOException { 57 // 创建字节输入和输出流 58 FileInputStream in = new FileInputStream(file2); 59 FileOutputStream out = new FileOutputStream(finalFile); 60 // 创建字节输入输出流缓冲区 61 BufferedInputStream Bin = new BufferedInputStream(in); 62 BufferedOutputStream Bout = new BufferedOutputStream(out); 63 // 调用方法读取数据 64 int flag = -1; 65 byte[] b = new byte[1024]; 66 while ((flag = Bin.read(b)) != -1) { 67 // 调用方法写数据 68 Bout.write(b, 0, flag); 69 Bout.flush(); 70 } 71 // 关闭资源,先关写再关读 72 Bout.close(); 73 Bin.close(); 74 } 75 }
结果:
才疏学浅,如果有更好的方法欢迎留言指点,谢谢!