2016-11-09 综合实战:文件拷贝

前言:模拟DOS系统的文件拷贝程序,实现字节流的综合使用。

一、简介

       在DOS系统中文件拷贝的命令:copy 源文件路径 目标文件路径

       实现的方法:

            |-将所有文件内容一次性读取到程序之中,而后一次性的输出:需要开辟一个跟文件大小一样的数组,但是如果文件过大,会造成程序崩溃;

            |-采用边读边输出的方法,就不会占用太多的内存空间。

 

image

 

       这里通过Eclise给设置两个初始化的参数:H:\my.jpg H:Hello.jpg;

范例代码:

package cn.mldn.demo22;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyDemo {
    public static void main(String[] args) throws Exception{
        long start = System.currentTimeMillis();
        if(args.length != 2){
            System.out.println("命令执行错误!");
            System.exit(1);//程序执行退出操作
        }
        //如果输入的擦拿书正确了,那么应该执行文件的验证
        File inFile = new File(args[0]);
        if(!inFile.exists()){//源文件是不存在
            System.out.println("源文件不存在,请重新确认文件路径");
            System.exit(1);
        }
        //如果源文件是存在的,那么就执行文件输出操作,同时考虑文件目录
        File outFile = new File(args[1]);
        if(!outFile.getParentFile().exists()){
            //输出路径不存在
            outFile.getParentFile().mkdirs();
        }
        //实现文件内容的拷贝
        InputStream input = new FileInputStream(inFile);
        OutputStream output = new FileOutputStream(outFile);
        //实现文件拷贝
        int temp = 0;//保存每次读取的内容
        while((temp = input.read())!=-1){
            output.write(temp);//输出单个字节
        }
        input.close();
        output.close();
        long end = System.currentTimeMillis();
        System.out.println("文件拷贝所花费的时间:"+(end-start)/1000+"s");
    }
}

运行结果:

image

       这里可以发现这样一个问题,在实际的运行过程中确实可以实现文件的拷贝操作,但是使用的时间实在是太长了。可以采用下面的改进方法;

范例代码★:(以后会经常看见,使用!)

package cn.mldn.demo22;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyDemo {
    public static void main(String[] args) throws Exception{
        // TODO Auto-generated method stub
        long start = System.currentTimeMillis();
        if(args.length != 2){
            System.out.println("命令执行错误!");
            System.exit(1);//程序执行退出操作
        }
        //如果输入的擦拿书正确了,那么应该执行文件的验证
         File inFile = new File(args[0]);
        if(!inFile.exists()){//源文件是不存在
            System.out.println("源文件不存在,请重新确认文件路径");
            System.exit(1);
        }
        //如果源文件是存在的,那么就执行文件输出操作,同时考虑文件目录
         File outFile = new File(args[1]);
        if(!outFile.getParentFile().exists()){
            //输出路径不存在
            outFile.getParentFile().mkdirs();
        }
        //实现文件内容的拷贝
         InputStream input = new FileInputStream(inFile);
        OutputStream output = new FileOutputStream(outFile);
        //实现文件拷贝
         int temp = 0;//保存每次读取的内容
         byte data[] = new byte[1024];
        while((temp = input.read(data))!=-1){
            output.write(data,0,temp);//输出数组
        }
        input.close();
        output.close();
        long end = System.currentTimeMillis();
        System.out.println("文件拷贝所花费的时间:"+(end-start)+"ms");
    }
}

运行结果:

image

       注意这里使用的单位是跟上面的代码不同的,速度明显提升了很多。

posted on 2016-11-09 19:50  G-X  阅读(137)  评论(0)    收藏  举报