使用Java开发文件COPY命令-java copyfile

在Dos系统中提供有文件拷贝的支持,该命令可以实现目录和文件的拷贝,Java的IO操作既然可以实现磁盘和流处理,就可以通过程序模拟此命令,本课程主要通过Java项目实战代码讲解了如何使用字节流进行文件与目录拷贝操作

使用Java开发文件COPY命令-java copyfile

在所有的操作系统之中都会存在有一个copy的处理命令,这个处理命令可以实现任意数据文件的复制操作,假设,以Windows系统为例,如果要想进行文件拷贝,则可以使用如下的命令完成:

copy h:\muyan.png h:\yootk.png

现在要求可以通过Java程序来实现这样的文件拷贝的处理命令,如果要自己来实现此时就面临如下几个问题:

第一个问题:是选择字节流还是使用字符流呢?

如果要进行文件拷贝的话有可能拷贝的文件是图片或者音乐视频等,那么使用字符流肯定不合适,这些数据全部都属于二进制的数据内容,那么最佳的做法就是采用字节流完成。

第二个问题:怎样实现拷贝处理呢?

对于文件的拷贝操作可以将其所有要拷贝的内容全部读取到内存之中,而后一次性的进行输出,或者采用管道的形式一点一点的进行读取和拷贝。如果要考虑到实际的性能的话,肯定使用第二种方式会更加方便。

第三个问题:对于拷贝命令中所需要输入的源文件路径和目标文件路径的定义可以采用初始化参数的形式完成处理。

范例:实现文件的拷贝处理

package com.yootk.demo;import java.io.*;class CopyUtil {private File inFile ;//输入文件路径private File outFile ;//输出文件路径/*** 通过数组实现拷贝参数的配置,这个数组的长度一定是2* 第一个内容为拷贝文件的源路径,第二个内容为拷贝文件的输出目标路径*@param args 拷贝的路径*/public CopyUtil(String args[]){if (args.length !=2){ //参数的个数不足System.out.println(“【ERROR】程序拷贝命令输入的参数不足,无法执行。”); System.out.println(“使用参考:java YootkDemo 源文件路径目标文件路径”); System.exit(1);//程序退出}this.inFile = new File(args[]);this.outFile = new File(args[1]); }public CopyUtil(String inPath, String outPath){this.inFile = new File(inPath);this.outFile = new File(outPath); }/*** 实现文件的拷贝处理操作*@return 拷贝文件所花费时间*/public long copy() throws IOException {// IOException是最大的IO异常long start = System.currentTimeMillis(); //获取开始时间InputStream input = null ; OutputStream output = null ;try { input = new FileInputStream(this.inFile); //字节输入流output = new FileOutputStream(this.outFile); //字节输出流byte data []= new byte[2048]; //每次拷贝2048个字节的内容int len =; //保存每次拷贝的长度while ((len = input.read(data))!=-1){ output.write(data,, len);//内容输出}} catch (IOException e){throw e ;} finally {if (input != null){ input.close();; }if (output != null){ output.close();} }long end = System.currentTimeMillis(); //获取结束时间return end – start ;//获取花费的时间}}public class YootkDemo {//李兴华编程训练营:yootkpublic static void main(String[] args) throws Exception { System.out.println(new CopyUtil(args).copy());} }

此时的程序是每一次实现拷贝“2048”个字节的信息内容,所以最终所花费的时间为65毫秒,但是随着拷贝文件大小的不同,这个的时间也一定会有所不同。

使用Java开发文件COPY命令-java copyfile

如果说你在面试的过程之中遇见有这种编写文件拷贝的问题,那么请一定要按照如上所给出的代码进行定义,但是如果说你现在定位的JDK版本为JDK 1.9及以后的版本,那么这些版本里面InputStream类是有一个新的拷贝方法支持的:

public long transferTo(OutputStream out) throws IOException

这个方法的出现就避免了之前每一次通过循环方式进行输入流和输出流的处理了,此时的copy()的方法实现简化了,相当于要替换如下的拷贝逻辑:

byte data []= new byte[2048]; //每次拷贝2048个字节的内容int len =; //保存每次拷贝的长度while ((len = input.read(data))!=-1){ output.write(data,, len);//内容输出}

范例:JDK 1.9之后的拷贝支持

public long copy() throws IOException {// IOException是最大的IO异常long start = System.currentTimeMillis(); //获取开始时间InputStream input = null ; OutputStream output = null ;try { input = new FileInputStream(this.inFile); //字节输入流output = new FileOutputStream(this.outFile); //字节输出流input.transferTo(output); //实现拷贝} catch (IOException e){throw e ;} finally {if (input != null){ input.close();; }if (output != null){ output.close();} }long end = System.currentTimeMillis(); //获取结束时间return end – start ;//获取花费的时间}

如果此时是在面试或笔试过程之中,你直接写上了这样的一个方法实现文件的拷贝,那么基本上就可以回家了,而对于当前使用的“input.transferTo(output)”方法其源代码定义如下:

public long transferTo(OutputStream out) throws IOException { Objects.requireNonNull(out,”out”);long transferred =;byte[] buffer = new byte[DEFAULTBUFFERSIZE];int read;while ((read = this.read(buffer,, DEFAULTBUFFERSIZE))>=) { out.write(buffer,, read); transferred += read;}return transferred;}

通过此时源代码的观察可以发现,当前的这种文件的拷贝操作会开辟一个非常大的缓冲区(不是由用户来决定的,是由JDK自己来决定的,并且无法修改)。

免责声明:文章内容来自互联网,本站仅提供信息存储空间服务,真实性请自行鉴别,本站不承担任何责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:使用Java开发文件COPY命令-java copyfile https://www.bxbdf.com/a/147605.shtml

上一篇 2023-08-07 08:26:38
下一篇 2023-08-07 08:37:48

猜你喜欢

联系我们

在线咨询: QQ交谈

邮件:362039258#qq.com(把#换成@)

工作时间:周一至周五,10:30-16:30,节假日休息。