FileCopy

/*【入】指的是到内存里,【出】指的是到内存外*/
import java.io.*;

public class MyReadFile{
    public static void main(String[] args){
        try{
            /*第一步,定位数据源&&目标文件*/
            File f = new File("D:/lab_2/test.txt");
            File f2 = new File("D:/lab_2/test2.txt");
            
            /*第二步,建立输入&&输出管道*/
            FileInputStream fis = new FileInputStream(f);
            FileOutputStream fos = new FileOutputStream(f2);
            
            /*第三步,操作管道*/
            for(;fis.available() > 0;)
                fos.write(fis.read());
            
        }catch(Exception e){}
    }
}

 由于是一个字节一个字节的读写,在文件稍微大一点的时候(大于1MB)时,速度会非常的慢。

稍作修改即可,每次1000个字节读写。

       byte[] tmp = new byte[1000];
            for(;fis.available() > 0;)
                fis.read(tmp);
                fos.write(tmp);

据说2的n次方计算机处理效率会更快。

            byte[] tmp = new byte[8192];
            for(;fis.available() > 0;)
                fis.read(tmp);
                fos.write(tmp);                                    

 最后是标准版。

/*第三步,操作管道*/
            byte[] tmp = new byte[8192];
            //处理大部分内容
            int length = fis.available()/8192;
            for(int i = 0; i < length; i ++){
                fis.read(tmp);
                fos.write(tmp);
            }
            //处理最后剩下的内容
            int size = fis.read(tmp);
            fos.write(tmp, 0, size);
/*

*/
import java.io.*;

public class MyReadFile{
    public static void main(String[] args){
        try{
            /*定位数据源&&定位目标文件*/
            File f = new File("D:/lab_2/test.txt");
            File f_copy = new File("D:/lab_2/test2.txt");
            
            /*建立将数据从硬盘输入到内存的管道
            &&建立将数据从内存输出到硬盘的管道*/
            FileInputStream fis = new FileInputStream(f);
            FileOutputStream fos = new FileOutputStream(f_copy);
            
            /*操作管道---->传输数据*/
            byte[] tmp = new byte[8192]; 
            /*建立一个临时的array用于一次性大量读写,提高读写大文件的效率*/
            
            /*********复制大部分数据******假设总共有8192+1024byte*****/
            
            int length = fis.available()/8192;                 /*根据假设length = 1*/ 
            
            /*这里除完后会有余数(长度小于8192),也就是会剩下一段数据读不到,
              如果int length = fis.available()/8192 + 1;多读一次的话,
              结果复制的文件会比源文件大,因为实际剩余的长度不足8192。*/
            
            for(int i = 0; i < length; i ++){
                fis.read(tmp);
                fos.write(tmp);
            }                                                /*根据假设复制了8192byte*/
            
            /**********复制剩下的数据**********根据假设还有1024byte***********/
            int left_length = fis.available();                /*根据假设left_length = 1024*/ 
            
            fis.read(tmp, 0, left_length);
            fos.write(tmp, 0, left_length);                    /*根据假设复制了1024byte*/
            
        }catch(Exception e){}
    }
}
原文地址:https://www.cnblogs.com/xkxf/p/6043223.html