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();
}
}
顺便打印出了文件上次修改时间,文件大小。