Java IO编程——文件拷贝
在操作系统里面有一个copy命令,这个命令的主要功能是可以实现文件的拷贝处理,现在要求模拟这个命令,通过初始化参数输入拷贝的源文件路径与拷贝的目标路径实现文件的拷贝处理。 需求分析:? ?·需要实现文件的拷贝操作,那么这种拷贝就有可能拷贝各种类型的文件,所以肯定使用字节流; ? ?·在进行拷贝的时候有可能需要考虑到大文件的拷贝问题; 实现方案:? ?·方案一:使用InputStream将全部要拷贝的内容直接读取到程序里面,而后一次性的输出到目标文件; |- 如果现在拷贝的文件很大,基本上程序就死了; ? ?·方案二:采用部分拷贝,读取一部分输出一部分数据,如果现在要采用第二种做法,核心的操作方法: ? ? ? |- InputStream:public int read?(byte[] b) throws IOException; ? ? ? |- OutputStream:public void write?(byte[] b,int off,int len) throws IOException; 范例:实现文件拷贝处理 1 import java.io.File; 2 java.io.FileInputStream; 3 java.io.FileOutputStream; 4 java.io.InputStream; 5 java.io.OutputStream; 6 class FileUtil { // 定义一个文件操作的工具类 7 private File srcFile ; 源文件路径 8 private File desFile ; 目标文件路径 9 public FileUtil(String src,String des) { 10 this(new File(src),new File(des)) ; 11 } 12 FileUtil(File srcFile,File desFile) { 13 this.srcFile = srcFile ; 14 this.desFile = desFile ; 15 16 public boolean copy() throws Exception { 文件拷贝处理 17 if (!this.srcFile.exists()) { 源文件必须存在! 18 System.out.println("拷贝的源文件不存在!"); 19 return false ; 拷贝失败 20 } 21 this.desFile.getParentFile().exists()) { 22 this.desFile.getParentFile().mkdirs() ; 创建父目录 23 24 byte data [] = new byte[1024] ; 开辟一个拷贝的缓冲区 25 InputStream input = null ; 26 OutputStream output = 27 try { 28 input = new FileInputStream(.srcFile) ; 29 output = new FileOutputStream(.desFile) ; 30 int len = 031 1、读取数据到数组之中,随后返回读取的个数、len = input.read(data 32 2、判断个数是否是-1,如果不是则进行写入、(len = input.read(data)) != -1 33 while ((len = input.read(data)) != -1) { 34 output.write(data,0,len); 35 } 36 true ; 37 } catch (Exception e) { 38 throw e ; 39 } finally40 if (input != 41 input.close(); 42 } 43 if (output != 44 output.close() ; 45 46 47 48 } 49 class JavaAPIDemo { 50 static void main(String[] args) throws Exception { 51 if (args.length != 2) { 程序执行出错 52 System.out.println("命令执行错误,执行结构:java JavaAPIDemo 拷贝源文件路径 拷贝目标文件路径"53 System.exit(1); 54 55 long start = System.currentTimeMillis() ; 56 FileUtil fu = new FileUtil(args[0],args[1]) ; 57 System.out.println(fu.copy() ? "文件拷贝成功!" : "文件拷贝失败!"58 long end =59 System.out.println("拷贝完成的时间:" + (end - start)); 60 61 } ?? ?? ?? ?但是需要注意的是,以上的做法是属于文件拷贝的最原始的实现,而从JDK1.9开始InputStream和Reader类中都追加有数据转存的处理操作方法: ? ? ? ·InputStream:public long transferTo?(OutputStream out) throws IOException; ? ? ? ·Reader:public long transferTo?(Writer out) throws IOException; 范例:使用转存的方式处理 24 InputStream input = 25 OutputStream output = 26 27 input = 28 output = 29 input.transferTo(output) ; 31 } 33 } 34 36 37 38 39 40 43 44 45 46 System.out.println("命令执行错误,执行结构:java JavaAPIDemo 拷贝源文件路径 拷贝目标文件路径"47 System.exit(149 50 FileUtil fu = 51 System.out.println(fu.copy() ? "文件拷贝成功!" : "文件拷贝失败!"52 53 System.out.println("拷贝完成的时间:" + (end -55 } ??此时千万要注意程序的运行版本问题。如果说现在对此程序要求进一步扩展,可以实现一个文件目录的拷贝呢?一旦进行了文件目录的拷贝还需要拷贝所有的子目录中的文件。 ? 范例:文件夹拷贝 boolean copyDir() 18 this.copyImpl(20 } 21 false22 24 private void copyImpl(File file) 递归操作 25 if (file.isDirectory()) { 是目录 26 File results [] = file.listFiles() ; 列出全部目录组成 27 if (results != 28 for (int x = 0 ; x < results.length ; x ++ copyImpl(results[x]) ; 30 } 31 32 } else { 是文件 33 String newFilePath = file.getPath().replace(this.srcFile.getPath() + File.separator,"") ; 34 File newFile = new File(this.desFile,newFilePath) ; 拷贝的目标路径 35 .copyFileImpl(file,newFile) ; 37 38 boolean copyFileImpl(File srcFile,File desFile) 39 desFile.getParentFile().exists()) { 40 desFile.getParentFile().mkdirs() ; 42 InputStream input = 43 OutputStream output = 44 45 input = FileInputStream(srcFile) ; 46 output = FileOutputStream(desFile) ; 48 49 } 50 51 } 52 53 55 56 57 58 59 60 61 62 63 System.out.println("拷贝的源文件不存在!"64 65 66 this.copyFileImpl(this.srcFile,1)">67 68 69 70 71 72 System.out.println("命令执行错误,执行结构:java JavaAPIDemo 拷贝源文件路径 拷贝目标文件路径"73 System.exit(174 75 76 FileUtil fu = 77 if (new File(args[0]).isFile()) { 文件拷贝 78 System.out.println(fu.copy() ? "文件拷贝成功!" : "文件拷贝失败!"79 } 目录拷贝 80 System.out.println(fu.copyDir() ? "文件拷贝成功!" : "文件拷贝失败!"81 82 83 System.out.println("拷贝完成的时间:" + (end -84 85 } 本程序是IO操作的核心代码,本程序可以理解整个的IO处理机制就非常容易理解了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |