字节流实现文件复制

本文介绍了一种使用Java进行文件及文件夹复制的方法,通过不同字节数组大小的比较,展示了如何提高复制效率。此外,还提供了一个示例,演示如何将指定文件夹内所有.java文件复制到另一文件夹并更改其扩展名为.jad。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.*;

/**
 * Created by Alan on 2017/1/18.
 */
public class FileCopy {
    public static void main(String[] args) throws IOException {
        File infile=new File("e:"+File.separator+"my.jpg");
        File outfile=new File("e:"+File.separator+"这个是Java测试文件夹"+File.separator+"tn.jpg");
        if(!infile.exists()){
            System.out.println("源文件不存在!");
        }
        if(outfile.exists()){
            outfile.delete();
        }else{
            outfile.createNewFile();
        }
        try{
            Thread.sleep(2000);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        long start=System.currentTimeMillis();
        InputStream in=new FileInputStream(infile);
        OutputStream out=new FileOutputStream(outfile);
        int t;
        while((t=in.read())!=-1){
            out.write(t);
        }
        in.close();
        out.close();
        long end=System.currentTimeMillis();
        System.out.println((end-start)+"ms");
    }
}



读入一个字节,写出一个字节,能实现复制,但是速度很慢。为了明显看出outfile存在的时候是先删除再复制,所以加了2s时间睡眠。

改进版:

import java.io.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by Alan on 2017/1/18.
 */
public class FileCopyUpdate {
    public static void main(String[] args) throws IOException {
        File infile=new File("e:"+File.separator+"my.jpg");
        File outfile=new File("e:"+File.separator+"这个是Java测试文件夹"+File.separator+"tn_update.jpg");
        if(!infile.exists()){
            System.out.println("源文件不存在!");
        }
        System.out.println("源文件大小:"+new BigDecimal((double)infile.length()/1024/1024).divide(new BigDecimal(1),2,BigDecimal.ROUND_HALF_UP)+"MB"+
                            "\t"+"上次修改时间:"+new SimpleDateFormat("yy-MM-dd HH:mm:ss").format(new Date(infile.lastModified())));
        if(outfile.exists()){
            outfile.delete();
        }else{
            outfile.createNewFile();
        }
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long start=System.currentTimeMillis();
        InputStream in=new FileInputStream(infile);
        OutputStream out=new FileOutputStream(outfile);
        byte[] data=new byte[1024];
        while(in.read(data)!=-1){
            out.write(data);
        }
        in.close();
        out.close();
        long end=System.currentTimeMillis();
        System.out.println("开始复制的时间:"+new SimpleDateFormat("yy-MM-dd HH:mm:ss:SS").format(new Date(start)));
        System.out.println("结束复制的时间:"+new SimpleDateFormat("yy-MM-dd HH:mm:ss:SS").format(new Date(end)));
        System.out.println((end-start)+"ms");
    }
}
将 字节读入字节数组data中,然后再将字节数组data写出,速度快很多。如果将字节数组换成byte[] data=new byte[1024*1024],速度更快。

下面将一个文件夹里面所有“.java”文件,复制到另一个文件夹,并将后缀改为“.jad”。

import java.io.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by Alan on 2017/1/22.
 */
public class CopyTest {
    public static void main(String[] args) throws IOException {
        long start=System.currentTimeMillis();
        System.out.println("开始时间:"+new SimpleDateFormat("yy-MM-dd HH:mm:ss:SS").format(new Date(start)));
        File infile=new File("f:"+File.separator+"Idea_java_workspace"+File.separator+"Practice"+File.separator+"src");
        File outfile=new File("e:"+File.separator+"这个是Java测试文件夹"+File.separator+"jad");
        if(!(infile.exists() && infile.isDirectory())){
            try {
                throw new Exception("目录不存在");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if(!(outfile.exists())){
            outfile.mkdir();
        }
        File[] files=infile.listFiles(new FilenameFilter(){
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".java");
            }
        });
        String suffix;
        for(File f:files){
            System.out.println(f.getName()+"\t"+"上次修改时间:"+new SimpleDateFormat("yy-MM-dd HH:mm:ss:SS").format(new Date(f.lastModified()))+"\t"
                                +"文件大小:"+new BigDecimal((double)f.length()).divide(new BigDecimal(1),2,BigDecimal.ROUND_HALF_UP)+"B");
            InputStream in=new FileInputStream(f);
            suffix=f.getName().replaceAll(".java",".jad");
            OutputStream out=new FileOutputStream(new File(outfile,suffix));
            copy(in,out);
        }
        long end=System.currentTimeMillis();
        System.out.println("结束时间:"+new SimpleDateFormat("yy-MM-dd HH:mm:ss:SS").format(new Date(end)));
        System.out.println("花费时间:"+(end-start)+"ms");
    }
    public static void copy(InputStream input,OutputStream output) throws IOException {
        byte[] data=new byte[1024];
        while(input.read(data)!=-1){
            output.write(data);
        }
        input.close();
        output.close();
    }
}
顺便打印出了文件上次修改时间,文件大小。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值