实验内容
编写一个命令行拷贝文件的程序XCopy,使用命令行参数传入源文件路径及目标文件路径,程序运行命令如下:
java XCopy 源文件路径 目标文件路径
具体要求:
·运行时,要输出文件拷贝进度(百分比进度)。
·利用依赖倒置原则,使用回调的方式通知界面显示进度,不能在拷贝文件时直接输出进度,即保证拷贝的功能与程序界面分离,考虑将来程序升级成图形界面时,拷贝的功能不需要任何修改,只需要修改界面程序即可
注意:
·本程序需要编写多个类(或接口),XCopy是主类。
·此程序要用到文件读取和写入,涉及流的操作,会用到如下两个类:
FileInputStream
int available()方法返回流的长度
int read(byte[] b)方法将数据读入字节数组b中,返回实际读取的长度
FileOutputStream
write(byte[] b, int off, int len)方法,将b中内容写入流
·会用到异常处理
·输出百分比进度时需要退格,用\b
·运行XCopy命令时,如果参数数量,文件路径不合法给出提示
代码
import java.io.*;
interface CallBack
{
void showProgress(int progress);
}
class ConsoleProgress implements CallBack
{
public void showProgress(int progress)
{
System.out.print("\b\b\b\b"+progress+"%");
}
}
class FileUtils
{
private CallBack cb;
public FileUtils()
{
}
public FileUtils(CallBack cb)
{
this.cb=cb;
}
public void copy(FileInputStream in, FileOutputStream out, int bufSize) throws IOException
{
int total=in.available();
int copied=0;
byte[] buf=new byte[bufSize];
int len=in.read(buf);
while(len>0)
{
out.write(buf,0,len);
copied+=len;
cb.showProgress((int)(100.0*copied/total));
len=in.read(buf);
}
}
}
public class XCopy {
public static void main(String[] args) throws IOException
{
if(args.length !=2)
{
System.out.println("命令格式错误!");
return;
}
FileInputStream fis=new FileInputStream(args[0]);
FileOutputStream fos=new FileOutputStream(args[1]);
CallBack cb=new ConsoleProgress();
FileUtils fu=new FileUtils(cb);
fu.copy(fis, fos, 1024*1024);
fis.close();
fos.close();
}
}
运行结果