JavaSE-文件拷贝

        模仿Linux中的cp指令,用Java实现一个文件拷贝的程序,主要是采用File Output/Intput Stream来进行文件的读取和写入效果。在实现文件拷贝的过程中,会发生以下的几种情况。

        1:源文件为文件

            (1)目标文件为文件:如果两文件名称相同,则默认覆盖拷贝。如果不相同,则创建新的文件并且拷贝。

            (2)目标文件为目录:如果目录中含有与输入名称同名的文件,默认为覆盖拷贝,否则创建新的文件并且拷贝。

        2:源文件为目录或者不存在则无法拷贝

以下是实现代码

public class Main{
    public static void main(String[] args)throws Exception{
        File FromFile = new File(args[0]);
        File Tofile = new File(args[1]);
        if(FromFile.isDirectory()){//如果源file不存在或者是个目录,那么就没有办法完成拷贝
            throw new Exception("目录无法拷贝");
        }
        if(!FromFile.exists()){
            throw new Exception("源file不存在");
        }
        if(FromFile.exists() && FromFile.isFile() && !Tofile.isDirectory()) {//源file和目标file都是文件,目标file不是目录
            Tofile.createNewFile();
            InputStream inputStream = new FileInputStream(FromFile);
            OutputStream outputStream = new FileOutputStream(Tofile);
            handleCopy(inputStream, outputStream);
        }
        if(Tofile.exists() && Tofile.isDirectory() && FromFile.isFile() && FromFile.exists()){//源file和目标file都存在,源file是文件,目标file是目录
            if(Tofile.getName().equals(FromFile.getParentFile().getName())){//如果是同一文件夹的文件拷贝
                return;
            }
            String ToFileName = FromFile.getName();//拿到目标文件的名字
            File to_file = new File(Tofile,ToFileName);
            to_file.createNewFile();//在目标目录下的创建和源名字相同的文件
            InputStream inputStream = new FileInputStream(FromFile);
            OutputStream outputStream = new FileOutputStream(to_file);
            handleCopy(inputStream,outputStream);
        }
    }

    public static void handleCopy(InputStream inputStream, OutputStream outputStream)throws Exception{
        long start = System.currentTimeMillis();
        int len = 0;
        byte[] data = new byte[102400000];//缓冲区100MB
        if ((len = inputStream.read(data)) != -1){//假设读出来的文件不为空
            outputStream.write(data,0,len);
        }
        long end = System.currentTimeMillis();
        System.out.println("拷贝成功! 使用了:"+(end-start)+"毫秒");
        inputStream.close();
        outputStream.close();
    }
}
        如有问题希望大家指出,谢谢。

猜你喜欢

转载自blog.csdn.net/qq_38449518/article/details/80296509